顶点着色器中的 uniform sampler2D
uniform sampler2D in Vertex Shader
我尝试用GLSL实现高度图。
为此,我需要将我的图片发送到 VertexShader 并获取灰色分量。
glActiveTexture(GL_TEXTURE0);
Texture.bind();
glUniform1i(mShader.getUniformLocation("heightmap"), 0);
mShader.getUniformLocation 使用 glGetUniformLocation 并且适用于片段、顶点着色器中使用的其他制服值。但是对于 heightmap return -1...
顶点着色器代码:
#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;
}
可能是获取高度的算法不好,但是获取 uniformlocation 的错误停止了我的工作..
怎么了?有什么想法吗?
UPD: texCoords(不是 TexCoords)当然在
中使用
h = scale * ((texture2D(heightmap, texCoords).r) - bias);
我的错误,但是并没有解决问题。有同样的错误..
我敢打赌您的变量已被驱动程序优化或着色器未正确 compile/link。在尝试编译你的着色器后(在我的 nVidia 上)我在日志中得到了这个:
0(9) : warning C7050: "TexCoords" might be used before being initialized
您应该经常检查 GLSL compile/link 日志?见
尤其是 glGetShaderInfoLog
的用法。
在线
h = scale * ((texture2D(heightmap, TexCoords).r) - bias);
您正在使用 TexCoords
,它是输出变量且尚未设置,因此行为未定义,很可能您的 gfx 驱动程序丢弃了该行(也可能是其他行)从中删除了 TexCoords
着色器完全,但这只是我的假设。
你有什么驱动和gfx卡?
您的设置的 returns 日志是什么?
我尝试用GLSL实现高度图。 为此,我需要将我的图片发送到 VertexShader 并获取灰色分量。
glActiveTexture(GL_TEXTURE0);
Texture.bind();
glUniform1i(mShader.getUniformLocation("heightmap"), 0);
mShader.getUniformLocation 使用 glGetUniformLocation 并且适用于片段、顶点着色器中使用的其他制服值。但是对于 heightmap return -1...
顶点着色器代码:
#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;
}
可能是获取高度的算法不好,但是获取 uniformlocation 的错误停止了我的工作.. 怎么了?有什么想法吗?
UPD: texCoords(不是 TexCoords)当然在
中使用h = scale * ((texture2D(heightmap, texCoords).r) - bias);
我的错误,但是并没有解决问题。有同样的错误..
我敢打赌您的变量已被驱动程序优化或着色器未正确 compile/link。在尝试编译你的着色器后(在我的 nVidia 上)我在日志中得到了这个:
0(9) : warning C7050: "TexCoords" might be used before being initialized
您应该经常检查 GLSL compile/link 日志?见
尤其是 glGetShaderInfoLog
的用法。
在线
h = scale * ((texture2D(heightmap, TexCoords).r) - bias);
您正在使用 TexCoords
,它是输出变量且尚未设置,因此行为未定义,很可能您的 gfx 驱动程序丢弃了该行(也可能是其他行)从中删除了 TexCoords
着色器完全,但这只是我的假设。
你有什么驱动和gfx卡?
您的设置的 returns 日志是什么?