首页 > 解决方案 > 如何在OpenGL中正确渲染到两个四边形

问题描述

我正在创建由两个四边形和两个相关联的不同着色器程序组成的 2D OpenGL 应用程序。

Quad A(左边的大)是主要的,并且有多个关联的纹理,右边的 Quad B 应该只有一个关联的纹理。

首先我绑定主四边形,准备好所有的纹理……一切都很好。

接下来我将第二个四边形与另一个着色器程序绑定(相同的顶点着色器但不同的片段着色器)

代码

glLinkProgram(shader_program_words)
glUseProgram(shader_program_words)

glAttachShader(shader_program_words, fragment_shader_words)
glAttachShader(shader_program_words, vertex_shader)

glBindBuffer(GL_ARRAY_BUFFER, vbo_words)
glBufferData(GL_ARRAY_BUFFER, Main.ShadersAndVerticiesForText.verticesB_size, Main.ShadersAndVerticiesForText.verticesB, GL_STATIC_DRAW)

encodeDataFromDataBuffer()//glVertexAttribPointer,glEnableVertexAttribArray ...

图片 在此处输入图像描述

右边是绿色,因为它应该是然后我更新与四边形 B 关联的纹理

  glActiveTexture(textSpec.actTextrureNumb); # active proper texture unit before binding
    glBindTexture(GL_TEXTURE_2D, textSpec.ID); 
    glTexSubImage2D(GL_TEXTURE_2D,0,xoffset,yoffset, widthh, heightt, GL_RED_INTEGER, textSpec.OpGlType, data)

basicRender(window)# 绘制三角形,交换缓冲区

一切正常 我应该改变颜色

在此处输入图像描述

接下来我回到主四边形

glUseProgram(shader_program)
glBindBuffer(GL_ARRAY_BUFFER, vbo_main)
glBufferData(GL_ARRAY_BUFFER, sizeof(Main.ShadersAndVerticies.vertices), Main.ShadersAndVerticies.vertices, GL_STATIC_DRAW)
encodeDataFromDataBuffer()//glVertexAttribPointer,glEnableVertexAttribArray ...
basicrender(window)// swap buffers and drraw triangles

它像主四边形一样工作,但右侧的四边形 B 恢复到初始颜色 - 这不是故意的

在此处输入图像描述

所以我尝试重新激活quad B并使其全部变为紫色(纹理修改代码与上面相同)

glLinkProgram(shader_program_words)
glUseProgram(shader_program_words)
glBindBuffer(GL_ARRAY_BUFFER, vbo_words)
glBufferData(GL_ARRAY_BUFFER, Main.ShadersAndVerticiesForText.verticesB_size, Main.ShadersAndVerticiesForText.verticesB, GL_STATIC_DRAW)

encodeDataFromDataBuffer()

在此处输入图像描述

所以现在我得到了随机数据——应该显示在左边右边,而在四边形 A 中什么也没有。正如我所见,着色器的切换效果很好。但是由于某种原因,数据在到达四边形 A 后没有进入四边形 B 的纹理。我还尝试在四边形之间切换之前清除颜色缓冲区并绑定到 0 纹理,但它没有帮助

glClearColor(0.0, 0.0, 0.1 , 1.0)
glBindTexture(GL_TEXTURE_2D, 0); 

我会深深感谢任何帮助,因为这对我来说非常令人费解。

标签: opengl

解决方案


好的,当我写它时,我想通了

glLinkProgram(shader_program_words) - 如果调用不止一个 - 我每次在四边形之间切换时都调用它是问题的根源


推荐阅读