美文网首页
基本着色器有哪些?

基本着色器有哪些?

作者: buding_ | 来源:发表于2022-12-20 11:47 被阅读0次

    单元着色器

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

    平面着色器

    GLShaderManager::UseStockShader(GLT_SHADER_FLAT, GLflot mvp[16], GLfloat vColor[4]);
    参数2: 允许变化的4*4矩阵
    参数3: 颜色
    使用场景: 在绘制图形时,可以应用变换(模型/投影变换)
    

    上色着色器

    GLShaderManager::UseStockShader(GLT_SHADER_SHADED, GLfloat mvp[16]);
    参数2: 允许变化的4*4矩阵
    使用场景:在绘制图形时,可以应用变换;颜色会平滑地插入到顶点之间称为平滑着色
    

    默认光源着色器

    GLShaderManager::UseStockShader(GLT_SHADER_DEFAULT_LIGHT, GLfloat mvMatrix[16], GLfloat pMatrix[16], GLfloat vColor[4]);
    参数2:模型4*4矩阵
    参数3:投影4*4矩阵
    参数4:颜色值
    使用场景:在绘制图形时,可以应用变换;这种着色器会使绘制的图形产生阴影和光照的效果
    

    点光源着色器

    GLShaderManager::UseStockShader(GLT_SHADER_POINT_LIGHT_DIFF, GLfloat mvMatrix[16], GLfloat pMatrix[16], GLfloat vLightPos[3], GLfloat vColor[4]);
    参数2:模型4*4矩阵
    参数3:投影4*4矩阵
    参数4:点光源的位置
    参数5:漫反射颜色值
    使用场景:在绘制图形时,可以应用变换;这种着色器会使绘制的图形产生阴影和光照的效果,与默认光源的区别是光源位置可以设置
    

    纹理替换矩阵着色器

    GLShaderManager::UseStockShader(GLT_SHADER_TEXTURE_REPLACE, GLfloat mvMatrix[16], GLint nTextureUnit);
    参数2:模型4*4矩阵
    参数3:纹理单元
    使用场景:在绘制时可以应用变换;这种着色器通过给定的模型视图投影矩阵,使用纹理单元进行颜色填充,其中每个像素点都是从纹理中获取
    

    纹理调整着色器时

    GLShaderManager::UseStockShader(GLT_SHADER_TEXTURE_MODULATE, GLfloat mvMatrix[16],  GLfloat vColor[4], GLint nTextureUnit);
    参数2:模型4*4矩阵
    参数3:颜色值
    参数4:纹理单元
    使用场景:在绘制时可以应用变换;这种着色器通过给定的模型视图投影矩阵;着色器将一个基本色乘以一个取自纹理单元nTextureUnit的纹理,将颜色与纹理进行颜色混合后才填入到片段中
    

    纹理光源着色器

    GLShaderManager::UseStockShader(GLT_SHADER_TEXTURE_POINT_LIGHT_DIFF, GLfloat mvMatrix[16],GLfloat pMatrix[16], GLfloat vLightPos[3]  GLfloat vBaseColor[4], GLint nTextureUnit);
    参数2:模型4*4矩阵
    参数3:投影4*4矩阵
    参数4:点光源位置
    参数5:颜色值(几何图形基本色)
    参数6:纹理单元
    使用场景:在绘制时可以应用变换;这种着色器通过给定的模型视图投影矩阵,着色器将一个纹理通过漫反射照明计算进行调整(相乘)
    
    

    图元

    基本图元.png 基本图元2.png

    批次类Batch

    一个简单的容器类,用于绘制图形

    void GLBatch::Begin(GLenum primitive, GLuint nVerts, GLuint nTextureUnits = 0);
    参数1:图元
    参数2:顶点数
    参数3:多少组纹理坐标(可选)
    //复制顶点数据(一个由3分量x,y,z顶点组成的数组)
    void GLBatch::CopyVertexData3f(GLfloat *vVerts);
    //复制表面法线数据
    void GLBatch::CopyNormalDataf(GLfloat *vNorms);
    //复制颜色数据
    void GLBatch::CopyColorData4f(GLfloat *vColors);
    //复制纹理坐标数据
    void GLBatch::CopyTexCoordData2f(GLfloat *vTex, GLuint uiTextureLayer)
    //结束数据复制
    void GLBatch::End(void);
    //绘制图形
    void GLBatch::Draw(void);
    
    //设置法线
    void GLBatch::Normal3f(GLfloat x, GLfloat y, GLfloat z);
    //设置纹理坐标
    void GLBatch::MultiTexCoord2f(GLuint texture, GLclampf s, GLclampf t);
    //添加顶点数据
    void GLBatch::Vertex3fv(M3DVector3f vVertex);
    

    投影

    正投影.png
    透视投影.png
    GLFrustum类通过SetPerspective方法为我们构建一个平截头体.
    GLFrustum::void SetPerspective(float fFov, float fAspect, float fNear, float fFar)
    *fFov: 垂直方向上的视场角度
    *fAspect: 窗口的宽度与高度的纵横比
    *fNear: 近截面的距离
    *fFar: 远截面的距离
    
    Example:
        //设置投影方式
        viewFrustum.SetPerspective(35.0f, float(w) / float(h), 1.0f, 500.0f);
        //将投影矩阵加入堆栈
        projectionMatrix.LoadMatrix(viewFrustum.GetProjectionMatrix());
    
    

    相关文章

      网友评论

          本文标题:基本着色器有哪些?

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