GLSL法线贴图着色器问题
GLSL normal mapping shader issues
VC++2010、OpenGL、GLSL、SDL
所以我有两个主要问题。我希望主要解决第一个问题:我使用的法线贴图着色器不适用于指向正或负x方向的法线。z和y似乎工作得很好(测试立方体上的纹理和法线(。
编辑:它似乎不是x方向的法线,因为当我旋转几何体时,面向前方的四边形仍然可以工作。因此,无论最初面向x的是什么,似乎都不起作用。
以下是一些简单的测试几何图形:
glBegin(GL_QUADS);
glNormal3f(0.0f, 0.0f, 1.0f);
glTexCoord2f(0.0, 0.0); glVertex3f(-1.0f, 0.0f, 1.0f);
glTexCoord2f(0.0, 1.0); glVertex3f(-1.0f, 2.0f, 1.0f);
glTexCoord2f(1.0, 1.0); glVertex3f(1.0f, 2.0f, 1.0f);
glTexCoord2f(1.0, 0.0); glVertex3f(1.0f, 0.0f, 1.0f);
glEnd();
glBegin(GL_QUADS);
glNormal3f(-1.0f, 0.0f, 0.0f);
glTexCoord2f(0.0, 0.0); glVertex3f(-1.0f, 0.0f, 1.0f);
glTexCoord2f(0.0, 1.0); glVertex3f(-1.0f, 2.0f, 1.0f);
glTexCoord2f(1.0, 1.0); glVertex3f(-1.0f, 2.0f, -1.0f);
glTexCoord2f(1.0, 0.0); glVertex3f(-1.0f, 0.0f, -1.0f);
glEnd();
顶点着色器
#define MAX_LIGHTS 8
#define NUM_LIGHTS 1
varying vec3 lightVec[MAX_LIGHTS];
varying vec3 viewVec;
attribute vec4 glTangent4f;
void main(void)
{
gl_Position = ftransform();
gl_TexCoord[0] = gl_MultiTexCoord0;
vec3 n = normalize(gl_NormalMatrix * gl_Normal);
vec3 t = normalize(gl_NormalMatrix * glTangent4f.xyz);
vec3 b = cross(n, t);
vec3 v;
vec3 vVertex = vec3(gl_ModelViewMatrix * gl_Vertex);
int i;
for (i=0; i<NUM_LIGHTS; ++i)
{
vec3 lVec = gl_LightSource[i].position.xyz - vVertex;
v.x = dot(lVec, t);
v.y = dot(lVec, b);
v.z = dot(lVec, n);
lightVec[i] = v;
}
vec3 vVec = -vVertex;
v.x = dot(vVec, t);
v.y = dot(vVec, b);
v.z = dot(vVec, n);
viewVec = v;
}
片段着色器
#define MAX_LIGHTS 8
#define NUM_LIGHTS 1
varying vec3 lightVec[MAX_LIGHTS];
varying vec3 viewVec;
uniform sampler2D colorMap;
uniform sampler2D normalMap;
void main (void)
{
vec2 uv = gl_TexCoord[0].st * 4.0;
vec4 base = texture2D(colorMap, uv);
vec4 final_color = vec4(0.2, 0.2, 0.2, 1.0) * base;
vec3 vVec = normalize(viewVec);
vec3 bump = normalize(texture2D(normalMap, uv).xyz * 2.0 - 1.0);
vec3 R = reflect(-vVec, bump);
int i;
for (i=0; i<NUM_LIGHTS; ++i)
{
vec3 lVec = normalize(lightVec[i]);
float diffuse = max(dot(lVec, bump), 0.0);
vec4 vDiffuse = gl_FrontLightProduct[i].diffuse * diffuse * base;
final_color += vDiffuse;
float specular = pow(clamp(dot(R, lVec), 0.0, 1.0), gl_FrontMaterial.shininess);
vec4 vSpecular = gl_FrontLightProduct[i].specular * specular * diffuse;
final_color += vSpecular;
}
gl_FragColor = final_color;
}
另一个问题(我现在不一定需要解决(是定向光的镜面反射似乎伴随着相机
attribute vec4 glTangent4f;
您实际上在哪里提供这个值?它是一个顶点属性,但渲染代码似乎没有提供任何内容。
"如何将此曲面切线传递给程序?">
你计算过物体的正切基了吗?我记得波前对象通常不包括顶点切线数据,在这种情况下,您需要在解析波前数据后计算切线基础。从代码的外观来看,您似乎根本没有切线数据。
也可以在顶点着色器中执行切线近似,也可以仅使用法线。
实际上,我不知道如何将切线数据传递给程序,因为您没有使用VBO。
编辑:
我现在明白了,我做出了一个愚蠢的假设,即你正在从三维文件格式加载数据,但你不是,但你仍然需要在某个地方计算切线。
相关文章:
- 警告处理为错误这里有什么问题
- 最小硬币更换问题(自上而下方法)
- 为"adjacent"变量赋值时出现问题
- 我的神经网络不起作用 [XOR 问题]
- 在Ubuntu 16.04上安装Cilk时出现问题
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 编译包含字符串的代码时遇到问题
- Project Euler问题4的错误解决方案
- 问题:什么是QAbstractItemView::NoEditTriggers的反面
- 在编译C++代码(具有dlib和opencv)到WASM时面临问题
- 在进程中对同一管道进行读取和写入时C++管道出现问题
- GLSL语法问题:意外的new_identifier
- 这个 glsl 代码有什么问题
- 我的glsl着色器加载代码有什么问题吗
- 着色器GLSL OpenGL上的投影矩阵问题
- GLSL着色器类帧速率问题
- GLSL法线贴图着色器问题
- 运行时GLSL着色器编译问题
- GLSL问题:一个程序中有多个着色器
- GLSL每像素照明问题