一、目的

1、采用了顶点常量属性方法画多彩六角星;

二、程序运行结果

三、顶点常量属性

   吴亚峰《OpenGL ES 3.x游戏开发》(上卷)内容
   前面的很多案例中,给每一个顶点都单独指定了颜色值,这在很多情况下是很好的一种选择。但是,如果一个物体中所有的顶点颜色是一样的,这样做就显得效率不高了。因为这样不但更多地占用了内存空间,还会无谓增加数据 IO 的时间。本节将向读者介绍顶点常量属性技术,通过其可以很好地解决上述效率不够高的问题,具体内容如下:

##1、顶点常量基本知识
   顶点常量属性是指给一个需绘制物体中的所有顶点指定同样的某方面(如颜色)属性值,在绘制时可以减小内存的占用以及 IO 传输的时间,以提高绘制效率。
##2、glVertexAttribNf 方法
   将 N 个浮点数传入管线,以备管线传递给由 N 个浮点数分量组成的属性变量, N 可能的取值为 1、 2、 3 或 4。
##3、glVertexAttribNfv 方法
   将长度为 N 的浮点数组或者长度为 N 的数据缓冲传入管线,以备管线传递给由 N 个浮点数分量组成的属性变量, N 可能的取值为 1、 2、 3 或 4。

四、源代码

"""
程序名称:GL_VertexAttrib4f.py
编程: dalong10
功能: 顶点常量属性应用的实现
参考资料: 《OpenGL ES 3.x游戏开发》(上卷)吴亚峰
"""
import myGL_Funcs        #Common OpenGL utilities,see myGL_Funcs.py
import glfw
from OpenGL.GL import *
import numpy
import numpy as np
import pyrr
from pyrr import Quaternion, matrix44, Vector3StarVS = """
# version 330
layout(location = 0) in vec3 a_position; //顶点位置
layout(location = 1) in vec3 a_color;   //顶点颜色
uniform mat4 rotation;                  //总变换矩阵
out vec3 v_color;                       //用于传递给片元着色器的变量
void main()
{gl_Position = rotation * vec4(a_position, 1.0);  //根据总变换矩阵计算此次绘制此顶点位置 v_color = a_color;          //将接收的颜色传递给片元着色器
}
"""StarFS = """
# version 330
in vec3 v_color;      //接收从顶点着色器过来的参数
out vec4 out_color;   //输出到的片元颜色
void main()
{out_color = vec4(v_color, 1.0f); //给此片元颜色值
}
"""class SixPointedStar:def initVertexData(self,R,r,z,color):  # 初始化顶点数据的initVertexData方法self.vertexs   = np.array([], np.float32)  # 位置FloatArray(numPoint * 3)self.color = color                         # 颜色# 把矩形平铺在一个平面上PI = np.pitempAngle=int(360/6)count=0for angle in range(0,360,tempAngle):  # 循环生成构成六角形各三角形的顶点坐标x1=0.0  #第一个三角形,三个点y1=0.0z1=zx2=R*np.cos(PI*angle/180) y2=R*np.sin(PI*angle/180)z2=zx3=r*np.cos(PI*(angle+tempAngle/2)/180) y3=r*np.sin(PI*(angle+tempAngle/2)/180) z3=zx4=0y4=0z4=z            x5=r*np.cos(PI*(angle+tempAngle/2)/180) y5=r*np.sin(PI*(angle+tempAngle/2)/180)z5=zx6=R*np.cos(PI*(angle+tempAngle)/180) y6=R*np.sin(PI*(angle+tempAngle)/180)z6=zself.vertexs=np.hstack((self.vertexs, np.array([x1,y1,z1], np.float32) ))  #每个顶点xyz三个坐标,6个顶点 self.vertexs=np.hstack((self.vertexs, np.array([x2,y2,z2], np.float32) ))    self.vertexs=np.hstack((self.vertexs, np.array([x3,y3,z3], np.float32) ))    self.vertexs=np.hstack((self.vertexs, np.array([x4,y4,z4], np.float32) ))    self.vertexs=np.hstack((self.vertexs, np.array([x5,y5,z5], np.float32) ))   self.vertexs=np.hstack((self.vertexs, np.array([x6,y6,z6], np.float32) ))            def __init__(self,R,r,z,color):self.R= Rself.r= rself.z = z  self.color=colorself.initVertexData(R,r,z,color)# load shadersself.program = myGL_Funcs.loadShaders(StarVS, StarFS)glUseProgram(self.program)self.vertIndex = glGetAttribLocation(self.program, b"a_position")self.colorIndex = glGetAttribLocation(self.program, b"a_color")# set up vertex array object (VAO)self.vao = glGenVertexArrays(1)glBindVertexArray(self.vao)            #  Step2: 创建并绑定VBO 对象 传送数据#self.vertexs= verticesvertexData = numpy.array(self.vertexs, numpy.float32)self.vertexBuffer = glGenBuffers(1)glBindBuffer(GL_ARRAY_BUFFER, self.vertexBuffer)glBufferData(GL_ARRAY_BUFFER, 4*len(vertexData), vertexData, GL_STATIC_DRAW)                 # enable arrays# 顶点位置属性glEnableVertexAttribArray(self.vertIndex)glVertexAttribPointer(self.vertIndex, 3, GL_FLOAT, GL_FALSE, vertexData.itemsize * 3, ctypes.c_void_p(0))    # unbind VAOglBindVertexArray(0)glBindBuffer(GL_ARRAY_BUFFER, 0)    def render(self, model):  # use shaderglUseProgram(self.program)# set modelview matrixglUniformMatrix4fv(glGetUniformLocation(self.program, 'rotation'), 1, GL_FALSE, model)       glUniform3f(glGetUniformLocation(self.program, "a_color"),  self.color[0],self.color[1],self.color[2])   # bind VAOglBindVertexArray(self.vao)# 顶点颜色属性#print(  self.color[0],self.color[1],self.color[2])glVertexAttrib3f(self.colorIndex, self.color[0],self.color[1],self.color[2])    glDrawArrays(GL_TRIANGLES,0,len(self.vertexs) )# unbind VAOglBindVertexArray(0)       # glfw callback functions
def window_resize(window, width, height):glViewport(0, 0, width, height)if __name__ == '__main__':import sysimport glfwimport OpenGL.GL as glcameraPos=np.array([2.0, 0.0, 3])      # 眼睛的位置(默认z轴的正方向)cameraFront=np.array([0.0, 0.0, 0.0])  # 瞄准方向的参考点(默认在坐标原点)cameraUp=np.array([0.0, 1.0, 0.0])     # 定义对观察者而言的上方(默认y轴的正方向)# Initialize the libraryif not glfw.init():sys.exit()# Create a windowed mode window and its OpenGL contextwindow = glfw.create_window(400, 300, "My OpenGL window", None, None)if not window:glfw.terminate()sys.exit()# set window's positionglfw.set_window_pos(window, 100, 100)# set the callback function for window resizeglfw.set_window_size_callback(window, window_resize)# make the context currentglfw.make_context_current(window)glClearColor(0, 0.1, 0.1, 1)glEnable(GL_DEPTH_TEST)glEnable(GL_BLEND)glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)scale1 = matrix44.create_from_scale(Vector3([1, 1, 1]))cube1 = matrix44.create_from_translation(Vector3([-0.2, 0, 0]))board= [None]*6     #创建对象数组color= [None]*3for i in range(6):if i==0:color=[1,0.0,0.1] #红elif i==1:color=[0.98,0.49,0.04] #橙elif i==2:color=[1,1.0,0.04]  # 黄elif i==3:color=[0.67,1.0,0]  #绿elif i==4:color=[0.27,0.4,1]  #蓝else :color=[0.88,0.43,0.9] #紫board[i]=SixPointedStar(0.2,0.5,-1*i,color)# the main application loopwhile not glfw.window_should_close(window):width, height = glfw.get_framebuffer_size(window)ratio = width / float(height)currentFrame =  1.0*glfw.get_time()glfw.poll_events()           gl.glViewport(0, 0, width, height)       gl.glClear(gl.GL_COLOR_BUFFER_BIT | gl.GL_DEPTH_BUFFER_BIT)gl.glMatrixMode(gl.GL_PROJECTION)gl.glLoadIdentity()gl.glOrtho(-ratio, ratio, -1, 1, 1, -1)gl.glMatrixMode(gl.GL_MODELVIEW)gl.glLoadIdentity()gl.glClearColor(0.0,0.0,4.0,0.0)  pMatrix = matrix44.create_perspective_projection_from_bounds(-ratio*0.4, ratio*0.4,  -0.4, 0.4,1,50,None)# modelview matrixmvMatrix = matrix44.create_look_at(cameraPos, cameraFront, cameraUp,None)for i in range(6):           model1 = matrix44.multiply(scale1, cube1)       model2 = matrix44.multiply(pMatrix,model1)       model3 = matrix44.multiply(mvMatrix,model2)        board[i].render( model3)glfw.swap_buffers(window)# terminate glfw, free up allocated resourcesglfw.terminate()

五、参考资料

1、大龙10的简书:https://www.jianshu.com/p/49dec482a291
2、吴亚峰《OpenGL ES 3.x游戏开发》(上卷)

Python之OpenGL笔记(34):采用了顶点常量属性方法画多彩六角星相关推荐

  1. Python之OpenGL笔记(33):透视投影画六角星

    一.目的 1.摄像机应用,透视投影画六角星: 二.程序运行结果 三.透视投影    吴亚峰<OpenGL ES 3.x游戏开发>(上卷)内容    现实世界中人眼观察物体时会有" ...

  2. python绘制六角星外廓_Python之OpenGL笔记(32):正交投影画六角星

    一.目的 1.摄像机应用,正交投影画六角星: 二.程序运行结果 三.摄像机的设置 吴亚峰<OpenGL ES 3.x游戏开发>(上卷)内容 从日常生活的经验中可以很容易地了解到,随着摄像机 ...

  3. python六角星_在Python中使用龟画出不同边长的六角星。

    希望我能解释得很好.我目前使用helper函数在python的turtle graphics窗口中绘制一个六角星.首先,我们必须创建一个绘制三角形的函数.这是我的代码:在Python中使用龟画出不同边 ...

  4. 使用OpenGL绘制六角星

    使用OpenGL绘制凸多边形时,不能直接使用GL_POLYGON来绘制:于是,我们便想到使用GL_LINE_LOOP来绘制凸多边形的边界 我们的六角星是凸多边形,可以使用GL_LINE_LOOP来绘制 ...

  5. Python之OpenGL笔记(26):不动点与旋转和缩放

    一.目的 1.画一组绕不动点旋转的正方体: 二.程序运行结果 三.为什么需要模型变换   OpenGL中的坐标处理过程包括模型变换.视变换.投影变换.视口变换等内容 具体过程如下图2所示:   我们在 ...

  6. Python——Youki觉得好用的Object父类的属性方法

    1 前言 今天在继续Python的编程~ 感觉Object中自带的获取属性的方法还是挺好用的,比如.__str__()方法~ 所以想要用笔记记录一下~ 2 Youki觉得好用的Object的属性方法 ...

  7. python实例方法、类方法@classmethod、静态方法@staticmethod和属性方法@property区别

    1.#类方法@classmethod,只能访问类变量,不能访问实例变量,通过cls参数传递当前类对象,不需要实例化,直接[类名.方法名()],可通过类对象和类对象实例访问 类方法:第一个参数强制为类对 ...

  8. Python正则表达式: 元字符/转义/分组/匹配原则/re模块属性方法大全

    正则表达式 动机 文本处理已经成为计算机常见工作之一 对文本内容的搜索,定位,提取是逻辑比较复杂的工作 为了快速方便的解决上述问题,产生了正则表达式技术 简介 定义 即文本的高级匹配模式,提供搜索,替 ...

  9. Python之OpenGL笔记(38):三种光照通道的合成

    一.目的 1.实现镜面光照射下的棋盘球体: 2.环境光.散射光.镜面光三种光照通道的合成 二.程序运行结果 三.镜面光    现实世界中,当光滑表面被照射时会有方向很集中的反射光.这就是镜面光(Spe ...

最新文章

  1. github后端开发面试题大集合(一)
  2. html语义化面试题,前端面试题-HTML结构语义化
  3. hexo博客完整备份
  4. CSSyphus:烦躁不安的烦恼设计指南。
  5. 领域应用 | 深度学习在知识图谱构建中的应用
  6. 现代软件工程 团队作业 - 软件分析和用户需求调查 (2013)
  7. 25 FI配置-财务会计-定义冲销原因
  8. AJAX 网页保留浏览器前进后退等功能
  9. cloud 调用列表并返回数据操作代码
  10. 经典网络DenseNet介绍
  11. 只要五分钟,即可将博客搬到公众号并完美布局(原创-独家)!
  12. Git 合并单个文件
  13. 【云计算学习教程】云应用是什么?典型的云应用有哪些?
  14. DirectX12 3D游戏开发实践(龙书)第二章_矩阵代数
  15. 《UEFI内核导读》全集,2023年更新
  16. 二极管选型-二极管参数介绍
  17. 105道CSS 面试知识点总结
  18. 2017-2018-2 20179215《密码与安全新技术》第1周作业
  19. Chrome浏览器安装本地插件
  20. C++我的世界源代码

热门文章

  1. c++中不区分大小写比较字符串大小
  2. java 接口鉴权_安全|Java中使用JWT生成Token进行接口鉴权实现
  3. developerWorks 中国 Lotus IBM Lotus Symphony 七种兵器之 Mail Merges
  4. 魔兽世界服务器维护时间拍卖行,魔兽世界8.0拍卖行更新_魔兽世界8.0拍卖行更新了什么_3DM网游...
  5. 影院购票系统 C#源代码
  6. 《电工学上》知识点整理(猴博士)
  7. ChatGPT列出全球最强的10个国家,中国排名意外
  8. 实现邮箱验证功能的代码
  9. 重装系统准备就绪时间太长了?
  10. 程序员工作2年月薪12K,在线面试指南