Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用OpenGL数组纹理?_Opengl_Textures_Texture2d - Fatal编程技术网

如何使用OpenGL数组纹理?

如何使用OpenGL数组纹理?,opengl,textures,texture2d,Opengl,Textures,Texture2d,我试图在OpenGL中使用sprite sheet,通过数组纹理实现它 这是我加载纹理的方式: 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_TEX

我试图在OpenGL中使用sprite sheet,通过数组纹理实现它
这是我加载纹理的方式:

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)
在另一个角将其绘制到四边形,因此我希望从四边形的第一行获得第一个精灵。
但我得到了这张损坏的图片:
这是整个雪碧表:


注意:整个图像加载正确,我可以通过传统的
GL\u纹理\u 2D

显示它或它的一部分,我不认为问题与阵列纹理直接相关。真正的问题在于如何将部分输入图像加载到纹理中:

glTexStorage3D(GL_纹理2D_数组,1,GL_RGBA,twidth/3,theight/4,12);
glTexSubImage3D(GL_纹理_2D_数组,0,0,0,twidth/3,the light/4,12,
GL_BGRA,GL_无符号字节,数据);
glTexSubImage3D()
调用不知道输入图像有多大。它将根据作为参数传入的大小顺序读取图像数据。如果您给它的宽度是原始图像宽度的1/3,它将从输入图像的第一行读取3个纹理行,然后从图像的第二行读取另外3个纹理行,以此类推

您可以使用
GL\u UNPACK\u ROW\u LENGTH
像素存储值指定输入行的大小(以像素为单位)。对于您的情况,以下调用指定输入图像的宽度:

glPixelStorei(GL_UNPACK_ROW_LENGTH,twidth);
我认为没有一种合理的方法可以通过一个
glTexSubImage3D()
调用将整个sprite表加载到数组纹理中。如果您对每个图像单独调用,这可能是最简单的。然后整个事情会是这样的:

GLuint texId=0;
glGenTextures(1和texId);
glBindTexture(GL_纹理_2D_数组,texId);
glTexParameteri(GL_纹理_2D_阵列,…);
int subWidth=twidth/3;
int subHeight=右侧/4;
glTexStorage3D(GL_纹理_2D_数组,1,GL_RGBA,子宽度,子重量,12);
glPixelStorei(GL_解包_行长度,twidth);
对于(int-iRow=0;iRow<4;++iRow){
对于(int iCol=0;iCol<3;++iCol){
glTexSubImage3D(
GL_纹理_2D_数组,0,
0,0,3*iRow+iCol,
副宽,副高,1,
GL_BGRA,GL_无符号字节,
数据+(iRow*分高*twidth+iCol*分宽)*4);
}
}

您可以尝试通过使用其他解包参数(如
GL\u unpack\u IMAGE\u HEIGHT
)来避免单独调用,但我不相信有适合这种情况的设置。

为什么不使用QOpenGLTexture、QOpenGLShaderProgram、QOPENGLDEBUGGERG等。?从您粘贴的几行代码来看,您的纹理可能不完整。@peppe,谢谢您的回答。哦,这很有趣:D我不使用所有这些,因为我不知道这些。我会尝试的,可能是我的问题可以解决,但我对此不感兴趣,因为我想学习纯OpenGL。谢谢。也许我误解了概念的一部分。我给出参数
twidth/3,the light/4
,因为我认为我必须给出sprite表中1(一)个图像的宽度和高度(而所有其他图像的大小相同)。我错了吗?嗯,为什么单独加载精灵更好?参数给出了您创建的纹理的大小。如果不设置
GL\u UNPACK\u ROW\u LENGTH
,它将假定输入图像具有相同的大小。但是您输入图像的宽度是
twidth
,而不是
twidth/3
。请给我看一下整个代码的样子好吗?(从
glTexStorage3D
到最后一个
glTexSubImage3D
)我尝试了您所有的技巧,但没有任何效果(即使是单独加载:每个
glTexSubImage3D
调用都会给出
GL\u无效\u操作
,我阅读了手册页,无法理解我的情况下出现此错误的原因)。我错过了什么嘿?你能帮帮我吗?我刚刚试过我发布的代码,它对我很有效。我编辑了答案,把所有的部分按顺序排列。