openGL纹理/着色器绑定
我是OpenGL的新手,在整理如何将纹理和着色器绑定到VBOs时遇到困难 我正在使用Cinder的纹理和着色器类。以下是我绘制方法的一部分: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 -
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()代码>
GLint loc=glGetUniformLocation(程序,“depthTexture”)代码>
glUniform1i(loc,0)代码>
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;