openGL纹理/着色器绑定

openGL纹理/着色器绑定,opengl,shader,textures,Opengl,Shader,Textures,我是OpenGL的新手,在整理如何将纹理和着色器绑定到VBOs时遇到困难 我正在使用Cinder的纹理和着色器类。以下是我绘制方法的一部分: mShader.bind(); myImage.bind(); glPushMatrix(); glTranslated( scaledX, scaledY, scaledZ); gl::draw(sphere.getVBO()); glPopMatrix(); glPushMatrix(); glTranslated( 0, 0, zshift -

我是OpenGL的新手,在整理如何将纹理和着色器绑定到VBOs时遇到困难

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

这是我使用的着色器的问题,还是我不理解的其他问题?(…还有很多我不明白)

谢谢

编辑:

以下是我正在使用的着色器:

(frag):

}

(垂直):


}

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

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


    有关在着色器中使用纹理的更深入示例,请参见。

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

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


    有关在着色器中使用纹理的更深入示例,请参见。

    显示着色器代码。大多数情况下,需要使用不同的着色器进行纹理处理。此外,这段代码将VBOs和着色器与不推荐的函数混合在一起。“我正在使用Cinder的纹理和着色器类。”如果您想了解OpenGL的工作原理,您需要将自己暴露于OpenGL,而不是隐藏OpenGL的类。我已经添加了着色器。我正在为一个心理学课程做一个项目,时间非常有限。我很快就会正确地学习OpenGL,但现在我只是想理解一些东西,把它们拼凑在一起。展示你的着色器代码。大多数情况下,需要使用不同的着色器进行纹理处理。此外,这段代码将VBOs和着色器与不推荐的函数混合在一起。“我正在使用Cinder的纹理和着色器类。”如果您想了解OpenGL的工作原理,您需要将自己暴露于OpenGL,而不是隐藏OpenGL的类。我已经添加了着色器。我正在为一个心理学课程做一个项目,时间非常有限。我很快就会正确地学习OpenGL,但现在我只是想理解足够多的东西来拼凑一些像样的东西过去由glEnable state控制的大部分内容现在都是根据着色器执行来定义的。好吧,嗯,是的,我这里显然缺少一些核心信息。当我使用displaylists(材质(灰烬类)将材质设置为每个列表绘制几何图形时,着色器中的阴影纹理正以我希望的方式工作。当我想在我制作的VBO上使用阴影着色器(通过导入我在photoshop中制作的.obj文件)时,问题就出现了;具体地说,当我在VBO周围缠绕纹理时,我似乎无法使当前着色器与VBO一起工作(这只是花的.png),因此您希望在VBO中对对象的面另外应用纹理?是的。我可以在没有着色器的情况下使用纹理,也可以在没有纹理的情况下使用着色器,但不能同时使用两者。问题似乎是我对着色器的工作方式一无所知;我希望我错过了一些简单的东西,但可能不是!您是否查看了我在回答中链接的教程?使用着色器,您不再需要
    glEnable(GL_纹理)过去由glEnable state控制的大部分内容现在都是根据着色器执行来定义的。好吧,嗯,是的,我这里显然缺少一些核心信息。当我使用displaylists(材质(灰烬类)将材质设置为每个列表绘制几何图形时,着色器中的阴影纹理正以我希望的方式工作。当我想在VBO上使用阴影着色器时,问题就出现了
    
    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;