【发布时间】:2013-08-01 07:03:30
【问题描述】:
我是 OpenGL 的新手,无法理清将纹理和着色器绑定到 VBO 的工作原理。
我正在使用 Cinder 的纹理和着色器类。这是我绘制方法的一部分:
mShader.bind();
myImage.bind();
glPushMatrix();
glTranslated( scaledX, scaledY, scaledZ);
gl::draw(sphere.getVBO());
glPopMatrix();
glPushMatrix();
glTranslated( 0, 0, zshift - 200);
mDisc.draw();
glPopMatrix();
在上面的代码中,如果我注释掉对 mShader.bind() 的调用,我的球体 VBO 将显示纹理 (myImage)。我的着色器适用于普通(无纹理)形状,但是当我在绘制任何带有包裹纹理的形状之前绑定着色器时,它会阻止纹理显示。
这是我正在使用的着色器的问题,还是我不理解的其他问题? (……还有很多不明白的地方)
谢谢
编辑:
这是我正在使用的着色器:
(片段):
uniform sampler2DShadow depthTexture;
varying vec3 N, V, L;
varying vec4 q;
void main(void)
{
vec3 normal = normalize( N );
vec3 R = -normalize( reflect( L, normal ) );
vec4 ambient = gl_FrontLightProduct[0].ambient;
vec4 diffuse = gl_FrontLightProduct[0].diffuse * max(dot( normal, L), 0.0);
vec4 specular = gl_FrontLightProduct[0].specular * pow(max(dot(R, V), 0.0), gl_FrontMaterial.shininess);
vec3 coord = 0.5 * (q.xyz / q.w + 1.0);
float shadow = shadow2D( depthTexture, coord ).r;
gl_FragColor = ((ambient + (0.2 + 0.8 * shadow) * diffuse) + specular * shadow);
}
(垂直):
varying vec3 N, V, L;
varying vec4 q;
uniform mat4 shadowTransMatrix;
void main(void)
{
vec4 eyeCoord = gl_ModelViewMatrix * gl_Vertex;
V = normalize( -eyeCoord.xyz );
L = normalize( gl_LightSource[0].position.xyz - eyeCoord.xyz );
N = gl_NormalMatrix * gl_Normal;
q = shadowTransMatrix * eyeCoord;
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
}
【问题讨论】:
-
显示你的着色器代码。大多数情况下,您将需要不同的着色器来进行纹理处理。此代码还将 VBO 和着色器与不推荐使用的功能混合在一起。
-
"我正在使用 Cinder 的纹理和着色器类。" 如果你想了解 OpenGL 的工作原理,你需要让自己接触 OpenGL ,而不是隐藏 OpenGL的类。
-
我已经添加了着色器。我正在为一个心理课程做一个项目,而且时间非常有限。我很快就会正确地学习 OpenGL,但现在我只是想理解足够多的东西来拼凑一些像样的东西。