美文网首页
OpenGL的一些学习

OpenGL的一些学习

作者: 小沛2016 | 来源:发表于2019-10-16 15:11 被阅读0次

资料来源:逻辑教育

OpenGL 固定管线中常见的几种着色器

单元着色器

GLShaderManager::UserStockShader(GLT_SHADER_IDENTITY,GLfloat vColor[4]);
参数1: 存储着色器种类-单元着色器
参数2: 颜⾊

使⽤场景: 绘制默认OpenGL 坐标系(-1,1)下图形. 图形所有片段都会以一种颜色填充

平面着色器

GLShaderManager::UserStockShader(GLT_SHADER_FLAT,GLfloat mvp[16],GLfloat vColor[4]);
参数1: 存储着色器种类-平⾯着⾊器 
参数2: 允许变化的4*4矩阵
参数3: 颜⾊

使⽤场景: 在绘制图形时, 可以应⽤变换(模型/投影变化)

上色着色器

GLShaderManager::UserStockShader(GLT_SHADER_SHADED,GLfloat mvp[16]);
参数1: 存储着⾊器种类-上⾊着⾊器 
参数2: 允许变化的4*4矩阵

使⽤场景: 在绘制图形时, 可以应用变换(模型/投影变化) 颜⾊将会平滑地插入到顶点之间 称为平滑着⾊色.

默认光源着色器

GLShaderManager::UserStockShader(GLT_SHADER_DEFAULT_LIGHT,GLfloat mvMatrix[16],GLfloat pMatrix[16],GLfloat vColor[4]);
参数1: 存储着⾊器种类-默认光源着⾊器 
参数2: 模型4*4矩阵
参数3: 投影4*4矩阵
参数4: 颜⾊值

使⽤场景: 在绘制图形时, 可以应用变换(模型/投影变化) 这种着⾊器会使绘制的图形产⽣阴影和光照的效果.

点光源着色器

GLShaderManager::UserStockShader(GLT_SHADER_POINT_LIGHT_DIEF,GLfloat mvMatrix[16],GLfloat pMatrix[16],GLfloat vLightPos[3],GLfloat vColor[4]);
参数1: 存储着⾊器种类-点光源着⾊器 
参数2: 模型4*4矩阵
参数3: 投影4*4矩阵
参数4: 点光源的位置
参数5: 漫反射颜色值

使⽤场景: 在绘制图形时, 可以应⽤变换(模型/投影变化) 这种着⾊器会使绘制的图形产⽣阴影和光照的效果.它与默认光源着⾊色器非常类似,区别只是光源位置可能是特定的.

纹理替换矩阵着色器

GLShaderManager::UserStockShader(GLT_SHADER_TEXTURE_MODULATE,GLfloat mvMatrix[16],GLfloat vColor[4],GLint nTextureUnit);
参数1: 存储着⾊器种类-纹理调整着⾊器
参数2: 模型4*4矩阵
参数3: 颜⾊值
参数4: 纹理单元

使⽤场景: 在绘制图形时, 可以应⽤变换(模型/投影变化)这种着⾊器通过给定的模型视图投影矩阵. 着⾊器将⼀个基本⾊乘以⼀个取⾃纹理单元nTextureUnit的纹理.将颜色与纹理进行颜⾊混合后才填充到片段中.

纹理光源着色器

GLShaderManager::UserStockShader(GLT_SHADER_TEXTURE_POINT_LIGHT_DIEF,G Lfloat mvMatrix[16],GLfloat pMatrix[16],GLfloat vLightPos[3],GLfloat vBaseColor[4],GLint nTextureUnit);
参数1: 存储着⾊器种类-纹理光源着⾊器 
参数2: 模型4*4矩阵
参数3: 投影4*4矩阵
参数4: 点光源位置
参数5: 颜⾊值(⼏何图形的基本⾊) 
参数6: 纹理单元

使⽤场景: 在绘制图形时, 可以应用变换(模型/投影变化)这种着⾊器通过给定的模型视图投影矩阵. 着⾊器将⼀个纹理通过漫反射照明计算进行调整(相乘)

openGL ⼯工具类 GLBatch

void GLBatch::Begain(GLeunm primitive,GLuint nVerts,GLuint nTexttureUnints = 0);
参数1: 图元
参数2: 顶点数
参数3: 1组或者2组纹理理坐标(可选)

//复制顶点数据(一个由3分量 x,y,z顶点组成的数组) 
void GLBatch::CopyVerterxData3f(GLfloat *vVerts);

//复制表面法线数据
void GLBatch::CopyNormalDataf(GLfloat *vNorms);

//复制颜色数据
void GLBatch::CopyColorData4f(GLfloat *vColors);

//复制纹理坐标数据
void GLBatch::CopyTexCoordData2f(GLFloat *vTextCoords, GLuint uiTextureLayer);

//结束数据复制
void GLBatch::End(void);

//绘制图形
void GLBatch::Draw(void);

在渲染过程中可能产生的问题

在绘制3D场景的时候,我们需要决定哪些部分是对观察者可见的,或者哪些部分是对观察者不可见的.对于不可见的部分应该及早丢弃例如在一个不透明的墙壁后,就不应该渲染.这种情况叫做”隐藏面消除"(Hidden surface elimination).

解决⽅方案: 正背⾯面剔除(Face Culling)

尝试观察一个3D图形,你从任何⼀个⽅方向去观察,最多可以看到⼏几个⾯面? 
答案是,最多3⾯面.
从一个立方体的任意位置和方向上看,你不可能看到多于3个⾯面. 

那么思考? 我们为何要多余的去绘制那根本看不不到的3个面? 
如果我们能以某种方式去丢弃这部分数据,OpenGL 在渲染的性能即可提⾼超过50%.

相关文章

网友评论

      本文标题:OpenGL的一些学习

      本文链接:https://www.haomeiwen.com/subject/aacumctx.html