顶点着色器中的均匀采样器2D

时间:2016-10-11 10:54:22

标签: c++ opengl glsl shader vertex-shader

我试图用GLSL实现高度图。 为此,我需要将我的图片发送到VertexShader并获得灰色组件。

glActiveTexture(GL_TEXTURE0);
Texture.bind();

glUniform1i(mShader.getUniformLocation("heightmap"), 0);

mShader.getUniformLocation 使用 glGetUniformLocation ,适用于Fragment,Vertex Shaders中使用的其他制服值。但是对于 heightmap 返回 -1 ...

VertexShader代码:

#version 330 core
layout (location = 0) in vec3 position;
layout (location = 1) in vec4 color;
layout (location = 2) in vec2 texCoords;
layout (location = 3) in vec3 normal;

out vec3 Normal;
out vec3 FragPos;
out vec2 TexCoords;
out vec4 ourColor;

uniform mat4 model;
uniform mat4 view;
uniform mat4 projection;

uniform sampler2D heightmap;

void main()
{
    float bias = 0.25;
    float h = 0.0;
    float scale = 5.0;

       h = scale * ((texture2D(heightmap, texCoords).r) - bias);
        vec3 hnormal = vec3(normal.x*h, normal.y*h, normal.z*h);
        vec3 position1 = position * hnormal;
       gl_Position = projection * view *  model * vec4(position1, 1.0f);


    FragPos = vec3(model * vec4(position, 1.0f));
    Normal = mat3(transpose(inverse(model))) * normal;
    ourColor = color;
    TexCoords = texCoords;
}

可能是获得高度的算法不好,但是获得统一位置的错误会阻止我的工作。 怎么了?有什么想法吗?

UPD: texCoords(不是TexCoords)当然是在使用

h = scale * ((texture2D(heightmap, texCoords).r) - bias);

我的错误,但它并没有解决问题。有相同的错误..

1 个答案:

答案 0 :(得分:4)

我的赌注是你的变量已被驱动程序优化或着色器没有正确编译/链接。在尝试编译着色器后(在我的 nVidia 上)我在日志中得到了这个:

0(9) : warning C7050: "TexCoords" might be used before being initialized

您应该始终检查 GLSL 编译/链接日志吗?见

尤其如何使用glGetShaderInfoLog

符合

h = scale * ((texture2D(heightmap, TexCoords).r) - bias);

您使用的是TexCoords,它是输出变量但尚未设置,因此行为未定义,很可能您的gfx驱动程序将该行抛弃(可能是其他行)从着色器中完全删除TexCoords但这只是我的假设。


你有什么司机和gfx卡?
您的设置中的日志会返回什么内容?