gpt4 book ai didi

opengl - 将两个纹理发送到 GLSL 着色器

转载 作者:行者123 更新时间:2023-12-02 11:35:56 26 4
gpt4 key购买 nike

将两个纹理发送到我的 GLSL 着色器时,实际上只有一个到达。奇怪的是我绑定(bind)的第一个纹理用于​​着色器中的两个纹理槽。这让我相信我在 OpenGL 中传递纹理的方式是错误的。但是,我无法找出问题所在。

这是我配置纹理以在着色器中使用的代码。

glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbo2);
glPushAttrib(GL_VIEWPORT_BIT | GL_ENABLE_BIT);
glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);


// Get uniforms
GLuint pass_3O = glGetUniformLocation(blend_shader, "org");
GLuint pass_3B = glGetUniformLocation(blend_shader, "blur");

// Activate shaders
glUseProgram(blend_shader);


// Bind first texture
glActiveTexture(GL_TEXTURE0 );
glBindTexture(GL_TEXTURE_2D, init_texture);

// Bind the second texture
glActiveTexture(GL_TEXTURE1 );
glBindTexture(GL_TEXTURE_2D, third_texture);

// Assign index to 2d images
glUniform1i(pass_3O, 0);
glUniform1f(pass_3B, 1);

上面的代码传递了两个纹理。第一个是 3D 场景的第一个渲染 channel 的 2D 图像。第三个是相同的纹理,但添加了 x2 级别的模糊。最后阶段是将它们混合在一起,以实现穷人的绽放。

这是我将两个纹理绘制到四边形的代码。

// Draw to quad
glBegin(GL_QUADS);
glMultiTexCoord2f(GL_TEXTURE0, 0.0f, 0.0f);
glMultiTexCoord2f(GL_TEXTURE1, 0.0f, 0.0f);
glVertex3f(-w_width/2.0, -w_height/2.0, 0.5f);

glMultiTexCoord2f(GL_TEXTURE0, 0.0f, 1.0f);
glMultiTexCoord2f(GL_TEXTURE1, 0.0f, 1.0f);
glVertex3f(-w_width/2.0, w_height/2.0, 0.5f);

glMultiTexCoord2f(GL_TEXTURE0, 1.0f, 1.0f);
glMultiTexCoord2f(GL_TEXTURE1, 1.0f, 1.0f);
glVertex3f(w_width/2.0, w_height/2.0, 0.5f);

glMultiTexCoord2f(GL_TEXTURE0, 1.0f, 0.0f);
glMultiTexCoord2f(GL_TEXTURE1, 1.0f, 0.0f);
glVertex3f(w_width/2.0, -w_height/2.0, 0.5f);
glEnd();
glFlush();
glPopAttrib();

// Unbind textures
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, 0);
glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, 0);

// Disable blend shader
glUseProgram(0);
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT,0);

这是我用来渲染最终图像的着色器。

垂直

#version 120
void main()
{
gl_TexCoord[0] = gl_MultiTexCoord0;
gl_TexCoord[1] = gl_MultiTexCoord1;
gl_Position = ftransform();
}

碎片

#version 120
uniform sampler2D org;
uniform sampler2D blur;
void main()
{
vec4 orig_clr = texture2D( org, gl_TexCoord[0].st);
vec4 blur_clr = texture2D( blur, gl_TexCoord[1].st );
//gl_FragColor = orig_clr;
gl_FragColor = blur_clr;
}

如果我在片段着色器的最后两行之间切换,我会得到相同的精确结果。更改渲染哪个纹理的唯一方法是更改​​绑定(bind)它们的顺序。

例如,下面的内容最终会向我传递模糊的图像。再次,只获取两个图像中的一个。

glActiveTexture(GL_TEXTURE0 );
glBindTexture(GL_TEXTURE_2D, third_texture);


glActiveTexture(GL_TEXTURE1 );
glBindTexture(GL_TEXTURE_2D, init_texture);

对我所忽略的事情有什么想法吗?

最佳答案

看看这段代码:

glUniform1i(pass_3O, 0);
glUniform1f(pass_3B, 1);

这里有一些小拼写错误,第二次调用中应该是 glUniform1*i* 而不是 Uniform1*f* 。该类型必须与着色器变量的类型匹配,因此此调用应该只会导致一些错误,使统一初始化为 0,这完全解释了您的结果。

关于opengl - 将两个纹理发送到 GLSL 着色器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16497794/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com