**已关闭。**此问题需要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
,但是需要刷新整张图片,效率没有提高,不能降低纹理精度,因为纹理显示需要高精度,希望有人能给予我一些建议。
可用的程式码片段。
第一个
1条答案
按热度按时间6fe3ivhb1#
你肯定不需要每帧都上传它们。你忘记的是在片段着色器中为
sampler2D
统一变量设置正确的值(你没有发布)。必须在绘制循环中调用
m_shaderProgram.setUniformValue("ourTexture", m_imageIdx);
GL_TEXTURE0
,正如@HolyBlackCat所指出的。默认情况下,它使用来自GL_TEXTURE0
的数据。您可以将GL_TEXTURE
想象为指向实际纹理的指针数组。glActiveTexture
设置哪个指针用于后续的GL调用,glBindTexture
为该活动指针赋值。均匀采样器的作用完全相同,您分配给它的索引是它将使用的数组元素。
这也意味着你只需要将所有纹理绑定到单独的单元一次,例如,在初始化期间你是如何做的(不必要的),然后只改变均匀采样器,没有绑定,没有激活需要。