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

OpenTK(C#)使用Uniform设置三角形颜色失败,始终显示黑色

问题分析与解决方案

你的三角形显示黑色的核心问题在于Uniform变量的设置流程错误,同时存在顶点属性配置的小问题,具体修正点如下:

1. 错误获取Uniform变量位置

GL.GetUniformLocation的第一个参数必须是着色器程序对象,而非VBO。Uniform是着色器程序的一部分,和缓冲区对象无关。

原错误代码:

int loc = GL.GetUniformLocation(VBO, "input_color");

修正后:

int loc = GL.GetUniformLocation(ShaderProgram, "input_color");

2. 设置Uniform前未激活着色器程序

OpenGL的Uniform设置是针对当前激活的着色器程序生效的,你在调用tricolor时还未激活ShaderProgram,导致Uniform值没有被正确写入目标程序。

需要在调用tricolor前先激活着色器:

GL.UseProgram(ShaderProgram);
tricolor(new Color4(0f, 0f, 1f, 1f));

同时,建议在tricolor方法内部也确保着色器处于激活状态,避免其他流程调用时出错:

public void tricolor(Color4 val)
{
    GL.UseProgram(ShaderProgram);
    int loc = GL.GetUniformLocation(ShaderProgram, "input_color");
    if (loc == -1)
        throw new Exception("cannot find location of uniform");
    GL.Uniform4(loc, val.R, val.G, val.B, val.A);
    Console.WriteLine("edit color");
}

3. 顶点属性指针分量数不匹配

你的顶点数据是3个分量(X/Y/Z),顶点着色器中定义的VPos也是vec3,但GL.VertexAttribPointer第二个参数设为了2,导致Z分量未被正确传递(虽然这不是颜色变黑的直接原因,但会导致顶点位置计算错误)。

原错误代码:

GL.VertexAttribPointer(0, 2, VertexAttribPointerType.Float, false, 3 * sizeof(float), 0);

修正后:

GL.VertexAttribPointer(0, 3, VertexAttribPointerType.Float, false, 3 * sizeof(float), 0);

额外验证步骤

可以在着色器链接完成后,检查程序链接状态,避免因为链接错误导致Uniform无法获取:

GL.GetProgram(ShaderProgram, GetProgramParameterName.LinkStatus, out int linkStatus);
if (linkStatus == 0)
{
    string linkInfo = GL.GetProgramInfoLog(ShaderProgram);
    Console.WriteLine("着色器程序链接错误:" + linkInfo);
}

内容的提问来源于stack exchange,提问作者matairis-incor-2

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 14:27:22