当前位置: 首页 > 知识库问答 >
问题:

openGL纹理/着色器绑定

储嘉悦
2023-03-14

我是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(),我的球体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个答案

裘光启
2023-03-14

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

  1. 设置活动纹理单元:glActiveTexture(GL_TEXTURE0);
  2. 激活纹理:可能myImage.bind();
  3. 获取统一变量'DepthTexture'的位置:GLint loc=glGetUniformAt(程序,"DepthTexture");
  4. 将纹理绑定到着色器中的纹理采样器:glUniform1i(loc,0);

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

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

 类似资料:
  • 我一直在尝试渲染到一个FBO,并将两个FBO渲染到屏幕上,但在合并两个FBO时进行深度测试失败。我尝试使用计算着色器合并纹理,但无法读取深度纹理的值(所有值都是值1,但渲染到FBO时深度测试有效)。有人知道我做错了什么,或者知道其他方法来合并两个FBO吗? 以下是我创建FBO的方式: 以下是我向FBO渲染的方式: 我尝试用glBindTexture绑定纹理(所有值均为1): 计算着色器: 我已尝试

  • 我想在FBO中加载两个纹理,其中一个纹理包含HDR图像,我的第一个目标是将图像从第一个纹理“复制”到第二个纹理(该纹理为空),并称为“下采样纹理”。 所以我创建FBO,加载我想用颜色_附件_0书写的纹理,并绑定它;然后初始化我的着色器程序并渲染一个四边形,其中包含我要在GL\u texture\u 0中读取的纹理。 然后我解开FBO并绑定“DownSamplingTex”,然后画一个四元组。 我不

  • 目前,我有问题与传递多个纹理到一个glsl着色器在iOS。 在渲染中,想要的纹理被绑定到制服上 我在这里一直使用GL_TEXTURE0和GL_TEXTURE1,因为当纹理(实际上是来自iPhone摄像头的luma和Chroma纹理,最终用于计算相应的rgb值)被创建时,这些textureLots被使用。 我使用的fragmentshader非常简单,它只是用给定的纹理对一个简单的屏幕填充四方进行纹

  • 我对如何将纹理绑定到GLSL中的插槽有点困惑。以下是我的着色器: 当我设置矩阵时,我需要查询统一位置,然后手动设置该位置的值,执行如下操作: 然而,据我所知,我不需要这样做来初始化我的纹理采样器。在设置时,我似乎只需要这样做: 所以,我的问题是,为什么我不需要对纹理进行与矩阵相同的处理?OpenGL运行时如何“知道”我绑定的纹理应该是我定义的采样器?如果我想拥有多种纹理,我该怎么做呢?

  • 我有一个非常简单的OpenGL应用程序,只渲染一个带纹理的四边形。这是我的代码,效果很好(带纹理的四边形看起来很好): 然后我想介绍一个简单的着色器。所以我稍微修改了我的代码: 顶点着色器: 片段着色器: 现在我得到的只是一个黑色的四边形:-( 我已经尝试并测试了很多东西: 着色器编译良好(无错误) 有人知道为什么我在使用着色器时看不到我的纹理吗?

  • 标准着色器 Unity 标准着色器是一个内置着色器,具有非常全面的功能。它可以用于渲染『真实世界』的对象,例如,石头、木材、玻璃、塑料和金属,并支持各种各样的着色器类型和组合。通过使用或不使用材质编辑器中的各种纹理插槽和参数,可以很容易地启动或禁用其功能。 标准着色器还包括一个称为 物理着色器(Physically Based Shading,PBS) 的高级光照模型。物理着色器以模拟真实世界的方