gpt4 book ai didi

opengl - 如何使用 OpenGL 阵列纹理?

转载 作者:行者123 更新时间:2023-12-03 23:25:20 25 4
gpt4 key购买 nike

我正在尝试在 OpenGL 中使用 Sprite 表,通过数组纹理实现它
这是我加载纹理的方式:

QImage image;
image.load("C:\\QtProjects\\project\\images\\spritesheet.png", "png");
const unsigned char* data = image.bits();
int twidth = image.width(), theight = image.height();
glTexStorage3D(GL_TEXTURE_2D_ARRAY, 1, GL_RGBA, twidth / 3, theight / 4, 12);
glTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 0, 0, 0, twidth / 3, theight / 4, 12, GL_BGRA, GL_UNSIGNED_BYTE, data);
glUseProgram(scene_program);

glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

这是我的片段着色器:
#version 330 core

in vec3 Color;
in vec2 Texture_coord;

out vec4 outColor;

uniform sampler2DArray tex;

void main()
{
vec2 coord;
coord.x = Texture_coord.x;
coord.y = Texture_coord.y;

vec4 color = texture(tex, vec3(coord, 0));

outColor = color;
}

我正在用纹理坐标将它绘制到四边形 (0.0, 0.0)在一个角落和 (1.0, 1.0)在其他方面,所以我希望从我的四边形的第一行获得第一个 Sprite 。
但是我得到了这张损坏的图像: http://i.stack.imgur.com/bfXgr.jpg
这是整个 Sprite 表: http://i.stack.imgur.com/LaZKP.png

P.S.: 整个图片加载正确,我可以显示它或者它的一部分通过传统 GL_TEXTURE_2D

最佳答案

我不相信这个问题与数组纹理直接相关。真正的问题在于您如何尝试将部分输入图像加载到纹理中:

glTexStorage3D(GL_TEXTURE_2D_ARRAY, 1, GL_RGBA, twidth / 3, theight / 4, 12);
glTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 0, 0, 0, twidth / 3, theight / 4, 12,
GL_BGRA, GL_UNSIGNED_BYTE, data);
glTexSubImage3D() call 不知道您的输入图像有多大。它只会根据您作为参数传入的大小顺序读取您的图像数据。如果你给它的宽度是原始图像宽度的 1/3,它将从输入图像的第一行读取 3 个纹理行,然后从图像的第二行读取另外 3 个纹理行,依此类推。
您可以使用 GL_UNPACK_ROW_LENGTH 指定输入行的大小(以像素为单位)像素存储值。对于您的情况,以下调用指定输入图像的宽度:
glPixelStorei(GL_UNPACK_ROW_LENGTH, twidth);
我认为没有一种合理的方法可以使用单个 glTexSubImage3D() 将整个 Sprite 表加载到数组纹理中。称呼。如果您为每个图像单独调用,这可能是最简单的。整个事情看起来像这样:
GLuint texId = 0;
glGenTextures(1, &texId);

glBindTexture(GL_TEXTURE_2D_ARRAY, texId);

glTexParameteri(GL_TEXTURE_2D_ARRAY, ...);

int subWidth = twidth / 3;
int subHeight = theight / 4;

glTexStorage3D(GL_TEXTURE_2D_ARRAY, 1, GL_RGBA, subWidth, subHeight, 12);

glPixelStorei(GL_UNPACK_ROW_LENGTH, twidth);

for (int iRow = 0; iRow < 4; ++iRow) {
for (int iCol = 0; iCol < 3; ++iCol) {
glTexSubImage3D(
GL_TEXTURE_2D_ARRAY, 0,
0, 0, 3 * iRow + iCol,
subWidth, subHeight, 1,
GL_BGRA, GL_UNSIGNED_BYTE,
data + (iRow * subHeight * twidth + iCol * subWidth) * 4);
}
}
您可以尝试使用其他解包参数(如 GL_UNPACK_IMAGE_HEIGHT)来避免单独调用。 ,但我不相信有适用于这种情况的设置。

关于opengl - 如何使用 OpenGL 阵列纹理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25349955/

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