前言
还是,番外篇链接附上。
跟新速度会稍慢一些,因为我有项目要做,请各位看官不要着急哈~
开始
pyopengl教程已经完结了,有同学可能问了,为什么没讲灯光?因为有人讲的已经非常好了😂。。。
灯光一般分为两种:
漫反射光照(diffuse
)是一种没有高光的光照,适应与粗糙的表面。另外,一般游戏和数学建模中不会使用镜面反射(就是漫反射+高光),但是在做效果展示的时候一般会用镜面反射。
基础知识
shader
shader,即"着色器",是指在渲染过程中控制颜色的语言,没错,着色器是一种语言,但是其实shader语言基本都是类c++语言
着色器分为顶点着色器(vertex shader
)和片段着色器(fragment shader
)。由于光照没有对应的OpenGL函数,只能使用着色器实现,所以这篇文章中只有着色器的写法。不过这里还是给一个模版。
注意⚠️:这段代码在python3.7中运行会产生大量错误,原因是OpenGLContext是python2.7中的库,已经很久没有更新。其中大部分错误是try-except
语句使用try-except ERR_TYPE,err
语句存储错误导致的语法错误,请在PyPI中下载压缩包,手动安装并下载依赖和跟改源码剔除错误
from OpenGLContext import testingcontext
from OpenGL.GL import shaders
from OpenGL.GL import *
BaseContext = testingcontext.getInteractive()
class TestContext(BaseContext):
def OnInit( self ):
vert_shader = '''
// ......Your Vertex Shader Here.....
'''
frag_shader = '''
// ......Your Fragment Shader Here.....
'''
vert_shad = shaders.compileShader(vert_shader,GL_VERTEX_SHADER)
frag_shad = shaders.compileShader(frag_shader,GL_FRAGMENT_SHADER)
self.shader = shaders.compileProgram(vert_shad,frag_shad)
def Render( self, mode = None):
BaseContext.Render( self, mode )
glUseProgram(self.shader)
# ......Draw Your Shape......
glUseProgram( 0 )
if __name__ == "__main__":
TestContext.ContextMainLoop()
漫反射
即为光在粗糙表面上散射,产生如下效果的反射方式
镜面反射
与漫反射相反,镜面反射是光在光滑的表面上光的反射效果
实现
shaders实现参见这篇博客就够了。
pyopengl使用shaders参考:
from OpenGLContext import testingcontext
from OpenGL.GL import shaders
from OpenGL.GL import *
BaseContext = testingcontext.getInteractive()
class TestContext(BaseContext):
def OnInit( self ):
vert_shader = '''
// ......Your Vertex Shader Here.....
'''
frag_shader = '''
// ......Your Fragment Shader Here.....
'''
vert_shad = shaders.compileShader(vert_shader,GL_VERTEX_SHADER)
frag_shad = shaders.compileShader(frag_shader,GL_FRAGMENT_SHADER)
self.shader = shaders.compileProgram(vert_shad,frag_shad)
def Render( self, mode = None):
BaseContext.Render( self, mode )
glUseProgram(self.shader)
# ......Draw Your Shape......
glUseProgram( 0 )
if __name__ == "__main__":
TestContext.ContextMainLoop()
结语
只有8期就讲完了,我尽量绕这VBO
和VAO
走,因为在PyOpenGL中没用(VBO
和VAO
是加速用的,可是python说实话已经很慢了。。。)
可是,还有项目篇,别走啊
作者
hit-road
拜拜,下课!
回到顶部