Python之OpenGL笔记(5):OpenGL着色器语言(GLSL)应用画三角形

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python之OpenGL笔记(5):OpenGL着色器语言(GLSL)应用画三角形相关的知识,希望对你有一定的参考价值。

参考技术A 1、修改顶点着色器让三角形上下颠倒;
2、使用uniform定义一个水平偏移量,在顶点着色器中使用这个偏移量把三角形移动到屏幕右侧。

  着色器是使用一种叫GLSL的类C语言写成的。GLSL是为图形计算量身定制的,它包含一些针对向量和矩阵操作的有用特性。
  着色器的开头总是要声明版本,接着是输入和输出变量、uniform和main函数。每个着色器的入口点都是main函数,在这个函数中我们处理所有的输入变量,并将结果输出到输出变量中。

  虽然着色器是各自独立的小程序,但是它们都是一个整体的一部分,出于这样的原因,我们希望每个着色器都有输入和输出,这样才能进行数据交流和传递。
  GLSL定义了in和out关键字专门来实现这个目的。每个着色器使用这两个关键字设定输入和输出,只要一个输出变量与下一个着色器阶段的输入匹配,它就会传递下去。但在顶点和片段着色器中会有点不同。
  如果我们打算从一个着色器向另一个着色器发送数据,我们必须在发送方着色器中声明一个输出,在接收方着色器中声明一个类似的输入。当类型和名字都一样的时候,OpenGL就会把两个变量链接到一起,它们之间就能发送数据了(这是在链接程序对象时完成的)。

  Uniform是一种从CPU中的应用向GPU中的着色器发送数据的方式,但uniform和顶点属性有些不同。首先,uniform是全局的(Global)。全局意味着uniform变量必须在每个着色器程序对象中都是独一无二的,而且它可以被着色器程序的任意着色器在任意阶段访问。第二,无论你把uniform值设置成什么,uniform会一直保存它们的数据,直到它们被重置或更新。

1、顶点坐标的 Y 值 乘以 -1,即 使三角形反转。(图形向量转换)
2、 渲染阶段,在程序中设定offset 值,传送给着色器。
3、glGetUniformLocation方法:获取着色器程序中,指定为uniform类型变量的id。
4、glUniform1f(GLint location, GLfloat v0); location指明要更改的uniform变量的位置;v0指明在指定的uniform变量中要使用的新值。
5、offset = 0.5
glUniform1f(glGetUniformLocation(self.program, "xOffset"), offset);将0.5的值赋给GLSL程序中的xOffset变量。

Python环境搭建之OpenGL

以下内容为我python OpenGl 环境搭建历程:

  win7 64位操作系统,python3.5.3 ,无其他相关。

  直接cmd或PowerShell输入以下命令:

pip install  PyOpenGL PyOpenGL_accelerate

  安装失败,提示需安装Microsoft Visual C++ 14.0,让我使用Microsoft Visual C++ build tools。并且后面给出了下载链接http://landinghub.visualstudio.com/visual-cpp-build-tools,在该链接下载得到文件visualcppbuildtools_full.exe,进行安装。。。

  失败,提示需要.net framework4.5.1以上

  一开始我下载了.net framework 4.5 发现还不能安装,于是重新搜索,终于在https://www.microsoft.com/zh-CN/download/details.aspx?id=48130找到4.6版本,下载得文件NDP46-KB3045560-Web.exe安装之。

  终于可以安Microsoft Visual C++ build tools(visualcppbuildtools_full.exe)了。

  经过漫长的等待VC++也搞定,重启后继续执行命令:

pip install  PyOpenGL PyOpenGL_accelerate

  一次性成功,兴奋之余在网上找了段测试代码,并稍作调整( glutCreateWindow(b"first")处,原文为glutCreateWindow("first"),运行会报错:Python glutCreateWindow error ‘wrong type‘,详情参见https://codeyarns.com/2012/04/27/pyopengl-glut-ctypes-error/ 

from OpenGL.GL import *
from OpenGL.GLU import *
from OpenGL.GLUT import *

def drawFunc():
    #清楚之前画面
    glClear(GL_COLOR_BUFFER_BIT)
    glRotatef(0.1, 5, 5, 0)   #(角度,x,y,z)
    glutWireTeapot(0.5)
    #刷新显示
    glFlush()
    
#使用glut初始化OpenGL
glutInit()
#显示模式:GLUT_SINGLE无缓冲直接显示|GLUT_RGBA采用RGB(A非alpha)
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA)
#窗口位置及大小-生成
glutInitWindowPosition(0,0)
glutInitWindowSize(400,400)
glutCreateWindow(b"first")
#调用函数绘制图像
glutDisplayFunc(drawFunc)
glutIdleFunc(drawFunc)
#主循环
glutMainLoop()

  运行,结果提示OpenGL.error.NullFunctionError: Attempt to call an undefined function glutInit, check for bool(glutInit) before calling。原来我没搭建glut,又开始漫长的搜寻路程,终于在http://download.csdn.net/detail/knownall/6799947找到需要的(其实就需要glut.h、glut64.dll、glut64.lib三个文件,32位同理)。

  下载解压后将文件夹内 glut.h 放在 C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\ 下;

  将 .\Release\glut64.lib 放在 C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\lib\ 下;

  将 .\Release\glut64.dll 放在 C:\Windows\System32 下。

  再次运行,终于大功告成,可以看到一个旋转的茶壶。

以上是关于Python之OpenGL笔记(5):OpenGL着色器语言(GLSL)应用画三角形的主要内容,如果未能解决你的问题,请参考以下文章

Python环境搭建之OpenGL

OpenGL学习笔记之坐标变换学习

python下学习opengl之简单窗口

OpenGL_Qt学习笔记之_05(纹理映射)(转)

python下学习opengl之矩形框

Android MediaCodec+OpenGL视频编解码实践笔记