OpenGL渲染基础

2020-07-06  本文已影响0人  Maji1

OpenGl渲染架构

OpenGl渲染架构.png

Attributes:包含顶点数据、投影矩阵、模型矩阵、纹理坐标(图片映射坐标)等数据。
Uniforms:一般指一次性传入不再改变的数据(变换矩阵、颜色值等)。
Texture Data:可以传到顶点着色器但是没有意义。

投影(相关类GLFrustum

// 所传参数分别是是X、Y、Z的最小值和最大值
Void SetOrthographic(GLfloat xMin, GLfloat xMax, GLfloat yMin, GLfloat yMax, GLfloat zMin, GLfloat zMax) 
{... }
void SetPerspective(float fFov, float fAspect, float fNear, float fFar)
{... }

OpenGL 着色器

GLShaderManager shaderManager;
shaderManager.InitializeStockShaders();
shaderManager.UseStockShader(GLT_SHADER_IDENTITY, vColor[4]);

GLT_SHADER_IDENTITY:着色器种类 单元着色器
vColor[4]:颜色
使用场景:绘制默认OpenGL坐标系(-1,1)下图形,图形所有片段都会以一种颜色填充。

shaderManager.UseStockShader(GLT_SHADER_FLAT,  mvp[16], vColor[4]);

GLT_SHADER_FLAT:着色器种类 平⾯着色器
mvp[16]:允许变化的4x4矩阵
vColor[4]:颜色
使用场景:在绘制图形时,可以应用于变换(模型/投影变化)。

shaderManager.UseStockShader(GLT_SHADER_SHADED,  mvp[16]);

GLT_SHADER_SHADED:着色器种类 上色着色器
mvp[16]:允许变化的4x4矩阵
使用场景:在绘制图形时,可以应用于变换(模型/投影变化)。颜色将会平滑的填充到顶点之间,称为平滑着色

shaderManager.UseStockShader(GLT_SHADER_DEFAULT_LIGHT,  mvMatrix[16], pMatrix[16], vColor[4]);

GLT_SHADER_DEFAULT_LIGHT:着色器种类 默认光源着色器
mvMatrix[16]:模型4x4矩阵
pMatrix[16]:投影4x4矩阵
vColor[4]:颜色
使用场景:在绘制图形时,可以应用于变换(模型/投影变化)。这种着色器绘制的图形产生阴影和光照的效果。

shaderManager.UseStockShader(GLT_SHADER_POINT_LIGHT_DIEF,  mvMatrix[16], pMatrix[16],vLightPos[3], vColor[4]);

GLT_SHADER_POINT_LIGHT_DIEF:着色器种类 点光源着色器
mvMatrix[16]:模型4x4矩阵
pMatrix[16]:投影4x4矩阵
vLightPos[3]:点光源的位置
vColor[4]:漫反射颜色值
使用场景:在绘制图形时,可以应用于变换(模型/投影变化)。这种着色器绘制的图形产生阴影和光照的效果。跟默认光源着色器非常类似,区别是光源位置可能是特定的

shaderManager.UseStockShader(GLT_SHADER_TEXTURE_REPLACE,  mvMatrix[16], nTextureUnit);

GLT_SHADER_TEXTURE_REPLACE:着色器种类 纹理替换矩阵着色器
mvMatrix[16]:模型4x4矩阵
nTextureUnit:纹理单元
使用场景:在绘制图形时,可以应用于变换(模型/投影变化)。这种着色器通过给定的模型视图投影矩阵,使用纹理单元来进行颜色填充。其中每个像素点的颜色是从纹理中获取。

shaderManager.UseStockShader(GLT_SHADER_TEXTURE_MODULATE,  mvMatrix[16],vColor[4], nTextureUnit);

GLT_SHADER_TEXTURE_MODULATE:着色器种类 纹理调整着色器
mvMatrix[16]:模型4x4矩阵
vColor[4]:颜色值
nTextureUnit:纹理单元
使用场景:在绘制图形时,可以应用于变换(模型/投影变化)。这种着色器通过给定的模型视图投影矩阵,着色器将一个基本色乘以一个取之纹理单元nTextureUnit的纹理,将颜色与纹理混合后才填充到片段中。

shaderManager.UseStockShader(GLT_SHADER_TEXTURE_POINT_LIGHT_DIEF,  mvMatrix[16],pMatrix[16],vLightPos[3], vBaseColor[4], nTextureUnit);

GLT_SHADER_TEXTURE_POINT_LIGHT_DIEF:着色器种类 纹理光源着色器
mvMatrix[16]:模型4x4矩阵
pMatrix[16]:投影4x4矩阵
vLightPos[3]:点光源位置
vBaseColor[4]:颜⾊值(几何图形的基本⾊)
nTextureUnit:纹理单元
使用场景:在绘制图形时,可以应用于变换(模型/投影变化)。这种着色器通过给定的模型视图投影矩阵,着色器将一个纹理通过漫反射照明计算进行调整(相乘)。

OpenGL 7种基本图元

OpenGL点/线

OpenGL三角形

对于OpenGL 光栅化最欢迎的是三角形。3个顶点就能构成一个三⻆形。三⻆形类型来自于顶点。并不是所有的三角形都是正三角形等。

三角形带

对于很多表面或者形状⽽言,我们会需要绘制⼏个相连的三角形。这时我们可以使用GL_TRIANGLE_STRIP图元绘制⼀串相连 三⻆形,从而节省⼤量的时间。

优点:
1、 用前3个顶点指定第1个三⻆形之后,对于接下来的每一个三⻆形,只需 要再指定1个顶点。需要绘制⼤量的三⻆形时,采用这种⽅法可以节省⼤量的程序代码和数据存储空间。
2、提供运算性能和节省带宽。更少的顶点意味着数据从内存传输到图形卡的速度更快,并且顶点着⾊器需要处理的次数也更少了。

三角形扇

对于很多表面或者形状⽽言,我们会需要绘制⼏个相连的三角形。 这时我们可以使用GL_TRIANGLE_FAN图元绘制⼀组围绕一 个中⼼点相连的三⻆形。

OpenGL ⼯具类 GLBatch

void Begin(GLenum primitive, GLuint nVerts, GLuint nTextureUnits = 0);

primitive:图元
nVerts:顶点数
nTextureUnits:⼀组或者2组纹理坐标(可选)

inline void CopyVertexData3f(GLfloat *vVerts) { ... }
inline void CopyNormalDataf(GLfloat *vNorms) { ... }
inline void CopyColorData4f(GLfloat *vColors) { ... }
inline void CopyTexCoordData2f(GLfloat *vTex, GLuint uiTextureLayer) { ... }
void End(void);
virtual void Draw(void);
上一篇 下一篇

猜你喜欢

热点阅读