pyopengl全解析-8

前言

还是,番外篇链接附上。
跟新速度会稍慢一些,因为我有项目要做,请各位看官不要着急哈~

开始

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期就讲完了,我尽量绕这VBOVAO走,因为在PyOpenGL中没用(VBOVAO是加速用的,可是python说实话已经很慢了。。。)

可是,还有项目篇,别走啊



作者

hit-road

拜拜,下课!
回到顶部

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值