着色器的介绍

着色器的使用

现代 OpenGL 要求我们至少设置一个顶点和片段着色器
主要步骤:

    1: 顶点着色器创建
    2:片段着色器创建
    3: 着色器程序
    4:使用着色器程序
顶点着色器创建:
  • 着色器源代码:

      const char *vertexShaderSource = "#version 330 core\n"
      "layout (location = 0) in vec3 aPos;\n"
      "void main()\n"
      "{\n"
      "   gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0);\n"
      "}\0";
    
  • 编译着色器:

      //创建着色器对象
      unsigned int vertexShader = glCreateShader(GL_VERTEX_SHADER); // GL_VERTEX_SHADER:着色器类型
      //将着色器源代码 添加到着色器对象上
      glShaderSource(vertexShader, 1, &vertexShaderSource, NULL);
      //编译着色器
      glCompileShader(vertexShader);
    
片段着色器创建
    同上:
   
    unisigned int  fragmentShader = glCreateShader(GL_FRAGMENT_SHADER); //GL_FRAGMENT_SHADER:片段着色器类型
    glShaderSource(fragmentShader, 1, &fragmentShaderSource, NULL);
    glCompileShader(fragmentShader);
着色器程序:
两个着色器现在都已编译,剩下要做的就是将两个着色器对象链接到一个着色器程序我们可以用来渲染




//创建着色器程序
unsigned int shaderProgram = glCreateProgram();
//将着色器添加进程序中
glAttachShader(shaderProgram, vertexShader);
glAttachShader(shaderProgram, fragmentShader);
//链接程序
glLinkProgram(shaderProgram);
使用着色器程序
    glUseProgram(shaderProgram);
### OpenGL 着色器简介 着色器是现代图形编程中的核心组件之一,在 OpenGL 中扮演重要角色。通过编写自定义的着色器代码,开发者可以控制如何处理顶点数据以及片段颜色计算。 #### 什么是着色器着色器是一种运行于 GPU 上的小型程序,用于执行特定类型的渲染操作。常见的两种主要类型为: - **顶点着色器 (Vertex Shader)**:负责处理输入几何体的位置和其他属性,并将其转换到屏幕空间坐标系中[^1]。 - **片段着色器 (Fragment Shader)**:也称为像素着色器,用来决定每个像素最终的颜色值。 除了这两种基本形式外,还有其他种类如几何着色器、曲面细分着色器等,但在初学者阶段通常只需要关注前两者即可。 #### 创建并编译着色器对象 为了创建一个简单的着色器,首先需要生成一个新的着色器对象,并加载源码字符串给它。下面是一个 Python 版本的例子来展示这个过程: ```python import OpenGL.GL as gl def compile_shader(shader_type, source_code): """Compile a shader from given type and source code.""" # Create new shader object shader_id = gl.glCreateShader(shader_type) # Attach source to shader object gl.glShaderSource(shader_id, source_code) # Compile the shader gl.glCompileShader(shader_id) # Check compilation status success = gl.glGetShaderiv(shader_id, gl.GL_COMPILE_STATUS) if not success: info_log = gl.glGetShaderInfoLog(shader_id).decode() raise RuntimeError(f"Error compiling shader:\n{info_log}") return shader_id ``` 此函数接受两个参数——`shader_type` 和 `source_code`,前者指定了要创建的是哪种类型的着色器(例如 GL_VERTEX_SHADER 或者 GL_FRAGMENT_SHADER),后者则是实际的 GLSL 源代码文本。 #### 链接着色器着色器程序 一旦有了单独的着色器之后,则需将它们链接成完整的着色器程序以便后续使用。这可以通过如下方式实现: ```python program_id = gl.glCreateProgram() # Assume vertex_shader & fragment_shader are already compiled shaders. gl.glAttachShader(program_id, vertex_shader) gl.glAttachShader(program_id, fragment_shader) gl.glLinkProgram(program_id) success = gl.glGetProgramiv(program_id, gl.GL_LINK_STATUS) if not success: info_log = gl.glGetProgramInfoLog(program_id).decode() print(info_log) else: # Use program after successful linking gl.glUseProgram(program_id) ``` 上述代码展示了如何把之前编译好的顶点和片段着色器附加到新创建的程序上,并尝试进行链接。如果一切顺利的话就可以调用 `glUseProgram()` 来激活该程序了。 #### 使用内置变量简化开发工作 对于更复杂的场景来说,可能会涉及到更多高级特性比如计算着色器。这类特殊用途的着色器允许直接访问一些预定义全局变量来进行高效的数据处理。例如,在 OpenCL 计算着色器中有几个非常有用的只读输入变量可以帮助定位当前线程位置及其所属工作组的信息[^3]: - `gl_WorkGroupSize`: 表示单个工作组内的局部维度大小; - `gl_NumWorkGroups`: 整个网格划分后的总工作组数量; - `gl_LocalInvocationID`: 当前线程在其所在的工作组内部的具体索引; - `gl_GlobalInvocationID`: 给定线程在整个网格范围内的绝对地址; - `gl_LocalInvocationIndex`: 单一整数值表示当前线程相对于其所在工作组起始处偏移量; 这些内建变量使得编写高效的并行算法变得更加容易直观。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值