Raylib中为顶点着色器添加逐顶点颜色缩放输入属性的疑问
解决方法:通过VBO实现逐顶点颜色缩放
是的,必须通过VBO(顶点缓冲对象)来实现逐顶点的颜色缩放控制——因为uniform是全局统一参数,无法为每个顶点单独设置不同的缩放值。
1. 修改顶点着色器
新增一个顶点输入属性,用于接收逐顶点的颜色缩放值,并在输出时应用到颜色上:
#version 330 core in vec4 vertexPosition; in vec4 vertexColor; in float vertexColorScale; // 新增的逐顶点属性 out vec4 v_color; uniform mat4 mvp; void main() { v_color = vertexColor * vertexColorScale; // 应用缩放 gl_Position = mvp * vertexPosition; }
2. 定义自定义顶点结构
调整顶点数据,加入颜色缩放字段,让每个顶点都能携带独立的缩放值:
#include "raylib.h" // 自定义顶点结构,包含位置、颜色、颜色缩放 typedef struct { Vector3 position; Color color; float colorScale; } CustomVertex;
3. 绑定顶点属性并创建VBO
在Raylib中,需要将自定义顶点的各个字段绑定到着色器对应的输入属性上:
// 加载编译着色器 Shader simpleShader = LoadShader("vertex_shader.glsl", "fragment_shader.glsl"); // 获取着色器中新增属性的位置 int colorScaleLoc = GetShaderLocation(simpleShader, "vertexColorScale"); // 填充自定义顶点数据 CustomVertex customVertices[] = { { {0.0f, 1.0f, 0.0f}, RED, 0.5f }, // 顶点1:颜色缩放0.5 { {-1.0f, -1.0f, 0.0f}, GREEN, 1.2f }, // 顶点2:颜色缩放1.2 { {1.0f, -1.0f, 0.0f}, BLUE, 0.8f } // 顶点3:颜色缩放0.8 }; int vertexNum = 3; // 创建顶点缓冲对象 unsigned int vbo = LoadVertexBuffer(customVertices, sizeof(CustomVertex), vertexNum, false); // 设置顶点属性:绑定colorScale字段到着色器属性 SetVertexAttribute(colorScaleLoc, 1, GL_FLOAT, false, sizeof(CustomVertex), (void*)offsetof(CustomVertex, colorScale));
4. 使用自定义VBO绘制
原来的DrawTriangleFan使用的是Raylib内置顶点格式,无法传递额外属性,需要改用自定义VBO绘制:
BeginDrawing(); ClearBackground(RAYWHITE); BeginShaderMode(simpleShader); BindVertexBuffer(vbo); DrawVertexBuffer(vbo, TRIANGLE_FAN, vertexNum); EndShaderMode(); EndDrawing();
内容的提问来源于stack exchange,提问作者user5265745
相关产品推荐
相关产品推荐

