OpenGL Shading Language 汇总

本文详细介绍了OpenGL Shading Language的各个部分,包括获取版本信息、创建和编译着色器对象、链接和使用着色器、清理资源、查询函数、指定顶点属性和统一变量。着重讲解了如何在OpenGL中使用shader,以及开发辅助功能,如获取实现相关的API值。此外,还涵盖了开发brick shaders的示例代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

overview

  1. glCreateShader创建一个shader,可以指定shader的类型等信息。
  2. 通过glShaderSource导入shader的源文件。
  3. 通过glCompileShader编译指定的shader。
  4. 通过glCreateProgram创建一个program。
  5. 通过glAttachShader来将一对shader绑定到一个program中。
  6. 通过glLinkProgram来将这对shader链接到该program中。
  7. 通过glUseProgram来使用该program。
  8. 如果shader使用了默认的uniform块,用glGetUniformLocation来查询uniform变量的地址,并且通过glUniform来设置它们的值。
  9. 如果shader使用了命名的uniform块,用glGetUniformBlockIndexglGetActiveUniformBlockiv来查询该uniform块的信息。查询uniform块中uniform变量的偏移值是通过glGetActiveUniformsiv来得到的。uniform块和绑定一些点(points)的buffer object的关联是通过glUniformBlockBinding来完成的。且,buffer object到这些点的绑定是通过glBindBufferRange来完成的。
  10. 如果vertex shader使用了用户定义的变量,application必须提供之,这是通过opengl api的调用来定位vertex attribute位置的。在一个vertex shader中,在这些属性数据被传给shader之前,泛型顶点属性的索引应该和一个变量相关联,这通常有2种方法。application可以显式创建之,通过在链接(linking)之前调用glBindAttribLocation。或者,如果没有显式的关联被创建,opengl会在linking这步自动关联。一个application可以查询这种关联,通过调用glGetAttribLocation。所以,泛型的顶点属性可以通过glVertexAttrib来传递给vertex shader;或者使用glVertexAttribPointerglEnableVertexArrayPointer结合标准的opengl命令来描画vertex arrays。
  11. 如果fragment shader使用了用户定义的输出(out)变量,application可能要创建用户定义的变量和fragment数据索引之间的关联,这通过在linking前调用glBindFragDataLocation来完成。或者,如果没有显式的关联,opengl会在linking时自动进行关联。一个application可以查询赋值,通过glGetFragDataLocation
  12. 一个application可能选择性地记录vertex shader的输出(out)变量到一个或多个可以tranform feedback的buffer。在vertex shader输出变量被记录前,vertex shader输出变量通过glTransformFeedbackVarying和绑定一些点的feedback buffer相关联;且buffer对象和这些点的绑定是通过glBindBufferRange来完成的。

1. obtaining version information

OpenGL和OpenGL shading language的版本号均可通过glGetString来获得。

void getGlVersion(int *major, int *minor) {
    const char *verstr = (const char *) glGetString(GL_VERSION);
    if ((verstr == NULL) || (sscanf(verstr, "%d.%d", major, minor) != 2))
    {
        *major = *minor = 0;
        fprintf(stderr, "Invalid GL_VERSION format!!!\n");
    }
}

void getGlslVersion(int *major, int *minor) {
    int gl_major, gl_minor;
    getGlVersion(&gl_major, &gl_minor);

    *major = *minor = 0;
    if (gl_major == 1)
    {
        const char *extstr = (const char *) glGetString(GL_EXTENSIONS);
        if ((extstr != NULL) &&
            (strstr(extstr, "GL_ARB_shading_language_100") != NULL))
    {
        *major = 1;
        *minor = 0;
    }
    }
    else if (gl_major >= 2)
    {
        const char *verstr = (const char *) glGetString(GL_SHADING_LANGUAGE_VERSION);

        if ((verstr == NULL) ||
            (sscanf(verstr, "%d.%d", major, minor) != 2))
        {
            *major = *minor = 0;
            fprintf(stderr, "Invalid GL_SHADING_LANGUAGE_VERSION format!!!\n");
        }
    }
}

2. creating shader objects

创建shader的函数原型:

GLuint glCreateShader(GLenum shaderType) // GL_VERTEX_SHADER/GL_FRAGMENT_SHADER

然后指定shader的源文件:

void glShaderSource(GLuint shader, GLsizei count, // 源码字符串数组的个数 const GLchar **
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值