如何在opengl中快速切换纹理显示[已关闭]

m3eecexj  于 2022-12-03  发布在  其他
关注(0)|答案(1)|浏览(131)

**已关闭。**此问题需要debugging details。当前不接受答案。

编辑问题以包含desired behavior, a specific problem or error, and the shortest code necessary to reproduce the problem。这将有助于其他人回答问题。
2小时前关门。
Improve this question
qt我用的是opengl,我有几张30000 * 20000大小的图片,有单通道,三通道,四通道图片,我想要实现的功能是通过键盘切换显示不同的图片,并且支持移动和缩放,现在我已经实现了这个功能,但是我遇到了一些问题。我想把它们绑定到不同的纹理单元上,在绘画的时候切换它们。但是好像没有效果。
第一个
通过切换m_imageIdx来切换当前显示的纹理。但是没有响应。我把它们绑定到同一个纹理单元,然后在刷新时加载它们。现在可以加载了,但是速度太慢了,无法接受。

void MyOpenGLWidget::paintGL()
{
    glClearColor(0.1f, 0.5f, 0.7f, 1.0f); 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    {
        glBindVertexArray(VAO[0]);

        m_shaderProgram.bind();                    
        createCameraTransformMatrix();
        m_shaderProgram.setUniformValue("model", m_mModel);
        m_shaderProgram.setUniformValue("view", m_mView);
        m_shaderProgram.setUniformValue("projection", m_mProjection);

        glActiveTexture(GL_TEXTURE0); 
        glBindTexture(GL_TEXTURE_2D, texture[m_imageIdx]);
        updateImage();
        if (!m_vImage[m_imageIdx].empty()) {
            int channel = m_vImage[m_imageIdx].channels();
            int internalFormat = GL_RGB, format = GL_RGB;
            getImageFormat(channel, internalFormat, format);

            glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
            glTexImage2D(GL_TEXTURE_2D, 0, internalFormat, m_imageWidth, m_imageHeight, 0, format, GL_UNSIGNED_BYTE, m_vImage[m_imageIdx].data);
        }
        m_shaderProgram.setUniformValue("imgWidth", m_imageWidth);
        m_shaderProgram.setUniformValue("imgHeight", m_imageHeight);
        glDrawArrays(GL_POLYGON, 0, 4);
        m_shaderProgram.release();
        glBindTexture(GL_TEXTURE_2D, texture[m_imageIdx]);
        glBindVertexArray(VAO[0]);
    }

我参考了一些类似的问题,尝试了glTexSubImage2D,但是需要刷新整张图片,效率没有提高,不能降低纹理精度,因为纹理显示需要高精度,希望有人能给予我一些建议。
可用的程式码片段。
第一个

6fe3ivhb

6fe3ivhb1#

你肯定不需要每帧都上传它们。你忘记的是在片段着色器中为sampler2D统一变量设置正确的值(你没有发布)。
必须在绘制循环中调用m_shaderProgram.setUniformValue("ourTexture", m_imageIdx);

  • 使用正确绑定的着色器
  • 这里不要使用GL_TEXTURE0,正如@HolyBlackCat所指出的。默认情况下,它使用来自GL_TEXTURE0的数据。您可以将GL_TEXTURE想象为指向实际纹理的指针数组。glActiveTexture设置哪个指针用于后续的GL调用,glBindTexture为该活动指针赋值。

均匀采样器的作用完全相同,您分配给它的索引是它将使用的数组元素。
这也意味着你只需要将所有纹理绑定到单独的单元一次,例如,在初始化期间你是如何做的(不必要的),然后只改变均匀采样器,没有绑定,没有激活需要。

相关问题