openGL纹理/着色器绑定

时间:2013-08-01 07:03:31

标签: opengl shader textures

我是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)。我的着色器适用于普通(无纹理)形状,但是当我使用包裹纹理绘制任何形状之前绑定着色器时,它会阻止显示纹理。

这是我正在使用的着色器的问题,还是其他我不理解的东西? (......还有很多我不理解)

由于

编辑:

这是我正在使用的着色器:

(FRAG):

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;

}

1 个答案:

答案 0 :(得分:2)

您必须在着色器中自行实现纹理采样。我看到着色器已经使用了阴影纹理采样器,是你要使用的纹理吗?如果是这样,你必须这样做:

  1. 设置活动纹理单元:glActiveTexture(GL_TEXTURE0);
  2. 激活纹理:可能myImage.bind();
  3. 获取统一变量'depthTexture'的位置:GLint loc = glGetUniformLocation(program, "depthTexture");
  4. 将着色器中的纹理绑定到纹理采样器:glUniform1i(loc, 0);
  5. 注意:在步骤3中,您必须将着色器程序ID作为第一个参数传递给glGetUniformLocation。我不知道 Cinder的纹理和着色器类,但我认为有一种方法可以直接查询它们以获得统一的变量位置(甚至可以直接设置变量值),或者至少它们应该是允许您获取程序ID。在步骤4中,您告诉OpenGL将depthTexture采样器设置为第一个纹理单元(其索引为0)的纹理;你需要这样做,因为你之前选择了这个纹理单元glActiveTexture(GL_TEXTURE0);

    另请参阅this以获取有关在着色器中使用纹理的更深入示例。