You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 08:40:07