[英]C++ shader, HLSL , how to send to the shader , the texture? “sampler2d”?
[英]uniform sampler2D in Vertex Shader
我试图用GLSL实现高度图。 为此,我需要将图片发送到VertexShader并获取灰色分量。
glActiveTexture(GL_TEXTURE0);
Texture.bind();
glUniform1i(mShader.getUniformLocation("heightmap"), 0);
mShader.getUniformLocation使用glGetUniformLocation并很好地用于Fragment,Vertex Shaders中使用的其他统一值。 但是对于高度图 返回 -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);
我的错,但并不能解决问题。 有同样的错误..
我敢打赌,您的变量已被驱动程序优化,或者着色器无法正确编译/链接。 在尝试编译您的着色器(在我的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卡?
什么返回您的设置日志?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.