无绑定数组纹理不起作用



我将对象的材质存储在由漫反射、凹凸、镜面反射等组成的阵列纹理2D中。然后,该纹理阵列的句柄将按顶点、沿顶点、uv、法线阵列存储在VAO中,而不是使用UBO或SSBO来实现相同的目的。

我的目标是将整个模型压缩为单个顶点阵列对象,因为一个模型可能有许多网格,每个网格可能有自己的纹理。通过这种方式,使用每个顶点存储的纹理控制柄,我可以在一次绘制调用中渲染整个模型。

问题是,所有对象都呈现为黑色,这向我表明采样器不工作,或者不知何故,句柄没有一直传输。着色器程序编译成功,几何体渲染正确(也就是说,我可以用固定的颜色替换最终的漫反射颜色并查看场景)。


纹理创建:

void TextureManager::FinishWorkOrders()
{
for ( ... ) {
Material_WorkOrder *material = Mat_Work_Orders[x];   
glGenTextures(1, material->gl_array_ID);
glBindTexture(GL_TEXTURE_2D_ARRAY, *material->gl_array_ID);
glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGBA, material->size.x, material->size.y, 5, 0, GL_RGBA, GL_UNSIGNED_BYTE, material->textureData);
glGenerateMipmap(GL_TEXTURE_2D_ARRAY);
glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_GENERATE_MIPMAP, GL_TRUE);
glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
glTexParameterf(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAX_ANISOTROPY_EXT, 16.0f);
// Material handle is of type GLuint64
*material->handle = glGetTextureHandleARB(*material->gl_array_ID);
glMakeTextureHandleResidentARB(*material->handle);
}
}

VAO生成:

GLuint ModelManager::genVAO(const vector<vec3> &vs, const vector<vec2> &uv, const vector<vec3> &nm, const vector<vec3> &tg, const vector<vec3> &bt, const vector<GLuint64*> &ts)
{
AttribBuffers b;
GLuint vao = 0;
size_t arraySize = vs.size();
glGenVertexArrays(1, &vao);
glBindVertexArray(vao);
glGenBuffers(MAX_BUFFERS, b.buffers);
// Vertex array
glBindBuffer(GL_ARRAY_BUFFER, b.buffers[0]);
glBufferData(GL_ARRAY_BUFFER, arraySize * sizeof(vec3), &vs[0][0], GL_STATIC_DRAW);
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);
...
// Texture Handle array
glBindBuffer(GL_ARRAY_BUFFER, b.buffers[5]);
glBufferData(GL_ARRAY_BUFFER, arraySize * sizeof(GLuint64), &ts[0], GL_STATIC_DRAW);
glEnableVertexAttribArray(5);
glVertexAttribLPointer(5, 1, GL_UNSIGNED_INT64_ARB, 0, 0);
glBindVertexArray(0);
return vao;
}

着色器用法:

顶点:

#version 450
#extension GL_ARB_bindless_texture : require
#extension GL_ARB_gpu_shader5 : require 
#extension GL_ARB_gpu_shader_int64 : require
layout (location = 0) in vec3 vertex;
...
layout (location = 5) in uint64_t texHandle;
flat out uint64_t TextureHandle;
void main(void)
{
TextureHandle           = texHandle;
...
gl_Position             = worldMVP * v;         
}

片段:

#version 450
#extension GL_ARB_bindless_texture : require
#extension GL_ARB_gpu_shader5 : require 
#extension GL_ARB_gpu_shader_int64 : require
flat in uint64_t TextureHandle;
layout (location = 0) out vec4 DiffuseOut; 
void main()                                 
{                           
sampler2DArray MaterialMap = sampler2DArray(TextureHandle);
... 
DiffuseOut = texture(MaterialMap, vec3(TexCoord0, 0));
}

问题是glBufferData不能接受指针向量。

我以这种方式设置数据,使得最后一个顶点属性数组是Glint64*句柄的数组,原因有二:1) 以便每个三角形的适当纹理将从顶点着色器流到片段着色器,2)以便我可以提前创建数组,并等待创建纹理,并通过单独更新底层指针自动更新数组

这是可行的,但需要将矢量从类型GLuint*更改为GLuint(放下指针)。

最新更新