从数组写入纹理对象

  • 本文关键字:纹理 对象 数组 c++
  • 更新时间 :
  • 英文 :


因为我用15填充了数组,所以我希望这个正方形是白色的。但当我运行代码时方块是黑色的。我的想法是使用缓冲区子数据将数组上传到缓冲区。我还尝试使用持久映射,以便我可以直接写入缓冲区内存。我写了一个函数,从文件中读取纹理使用stb图像。为什么当使用stb image初始化数组时,图像显示了,但它不能与这个数组

一起工作?这里是我认为代码出错的地方:

voxelEngine::BiomeMap::BiomeMap(int textureUnit) {
pixels = new unsigned char[apothem*apothem*4];
for(size_t i = 0; i < sizeof(pixels); i++) {
pixels[i] = 1;
}
_textureUnit = textureUnit;
glGenBuffers(1, &vao);
glGenBuffers(1, &vbo);
glGenBuffers(1, &ebo);
glGenBuffers(1, &tbo);
glBindVertexArray(vao);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
float vertex_data[] = {
0, 0, 0,    0, 0,
0, 1, 0,    0, 1,
1, 1, 0,    1, 1,
1, 0, 0,    1, 0
};
glBufferData(GL_ARRAY_BUFFER, sizeof(vertex_data), vertex_data, GL_STATIC_DRAW);
unsigned int indices[] = {
0, 1, 2,
0, 2, 3
};
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);
glActiveTexture(GL_TEXTURE0 + _textureUnit);
glBindBuffer(GL_TEXTURE_2D, tbo);
glTexImage2D(GL_TEXTURE_2D, 1, GL_RGBA, apothem, apothem, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels);
glTexSubImage2D(GL_TEXTURE_2D, 1, 0, 0, apothem, apothem, GL_RGBA, GL_UNSIGNED_BYTE, pixels);
// set the texture wrapping/filtering options (on the currently bound texture object)
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);   
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
//glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA, apothem, apothem);
glGenerateMipmap(GL_TEXTURE_2D);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 5*sizeof(float), (void*)0);
glEnableVertexAttribArray(0);
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 5*sizeof(float), (void*)(3*sizeof(float)));
glEnableVertexAttribArray(1);
}

片段着色器:

#version 330 core
out vec4 FragColor;
in vec2 oTexCoord;
uniform sampler2D my_sampler;
void main()
{
FragColor = texture(my_sampler, oTexCoord);
//FragColor = vec4(1, 1, 1, 1);
}

顶点着色器:

#version 330 core
layout (location = 0) in vec3 aPos;
layout (location = 1) in vec2 texCoord;
out vec2 oTexCoord;
uniform mat4 modelMat;
uniform mat4 projMat;
void main()
{
gl_Position = projMat * modelMat * vec4(aPos.x, aPos.y, aPos.z, 1.0);
oTexCoord = texCoord;
}

什么图像格式teximage2d期望为什么不rgba颜色值的线性数组工作?它是否与texsubimage/teximage2d有关,或者纹理没有正确配置?

pixels = new unsigned char[apothem*apothem*4];

此分配apothem*apothem*4unsigned chars。

for(size_t i = 0; i < sizeof(pixels); i++) {

sizeof(pixels)并不像你想象的那样。由于pixels可能是unsigned char *,因此在64位平台上,sizeof(pixels)将始终为8,因为所有指针占用8个字节。

我用1s填充数组

不,你没有。您只填充了数组中的前8个值。而且,如果apothem恰好是1,你只是打乱了一堆内存,并创建了未定义的行为。

修复是显而易见的。

size_t pixels_s=apothem*apothem*4;
pixels = new unsigned char[pixels_s];
for(size_t i = 0; i < pixels_s; i++) {

等等

甚至更好:忘记new,使用std::vector<unsigned char>,使用适当的构造函数来分配向量并初始化它,您不必担心忘记delete任何东西,并泄漏内存。这就是std::vector的作用

最新更新