glsl顶点着色器glGetUniformLocation失败

 mobiledu2502868835 发布于 2023-02-08 13:46

我想在我的顶点着色器中设置一个统一的矢量.

int loc = glGetUniformLocation(shader, "LightPos");
if (loc != -1)
{
    //do Stuff
}

问题是loc始终为-1.我尝试使用片段着色器中的变量实际工作.顶点着色器:

uniform vec3 LightPos;
varying vec2 UVCoord;
varying float LightIntensity;

void main()
{           
    UVCoord = gl_MultiTexCoord0.st;
    gl_Position = ftransform();
    vec3 Normal = normalize(gl_NormalMatrix * gl_Normal);
    LightIntensity = max(dot(normalize(vec3(0, -10, 0)), Normal), 0.0);
}

片段着色器:

uniform sampler2D tex1;
varying vec2 UVCoord;
varying float LightIntensity;

void main()
{
    vec3 Color = vec3(texture2D(tex1, UVCoord));
    gl_FragColor = vec4(Color * LightIntensity, 1.0);
}

有人知道我做错了什么吗?

1 个回答
  • 不幸的是,你误解了glGetUniformLocation (...)一般的工作方式和统一的位置分配.

    只有在编译和链接着色器后才会分配位置.这是一个两阶段操作,只能有效地识别GLSL程序所有阶段(顶点,片段,几何,曲面细分)之间使用的输入和输出.因为LightPos未在顶点着色器中使用(或者在其他任何地方使用),因此在链接程序时不会为其分配位置.它根本不存在.

    这就是活跃制服这个词的来源.并且glGetUniformLocation (...)只返回活动制服的位置.


    名称

    glGetUniformLocation - 返回统一变量的位置

    [...]

    描述

    glGetUniformLocation返回一个整数,表示程序对象中特定统一变量的位置.name必须是不包含空格的空终止字符串.name必须是程序中的活动统一变量名,它不是结构,结构数组或向量或矩阵的子组件.如果name与程序中的活动统一变量不对应,如果name以保留前缀"gl_"开头,或者name与原子计数器或命名统一块相关联,则此函数返回-1.

    2023-02-08 13:49 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有