[英]How do I use image store with 3D textures?
我正在嘗試將數據存儲到3D紋理中,但是它似乎不起作用。 我這樣設置紋理:
glGenTextures(1, &voxelTexture);
glBindTexture(GL_TEXTURE_3D, voxelTexture);
unsigned char clearData[VoxelSize* VoxelSize* VoxelSize];
memset(clearData, 5, sizeof(clearData));
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
glTexImage3D(GL_TEXTURE_3D, 0, GL_R8UI, VoxelSize, VoxelSize, VoxelSize, 0, GL_RED_INTEGER, GL_UNSIGNED_BYTE, clearData);
后來,我寫了紋理:
glBindFramebuffer(GL_FRAMEBUFFER, 0);
glViewport(0, 0, VoxelSize, VoxelSize);
glUseProgram(voxelProg);
glBindTexture(GL_TEXTURE_3D, voxelTexture);
glBindImageTexture(0, voxelTexture, 0, GL_TRUE, 0, GL_WRITE_ONLY, GL_R8UI);
for(const auto & i : models){
glUniformMatrix4fv(glGetUniformLocation(voxelProg, "M"), 1, GL_FALSE, glm::value_ptr(i->getModelMatrix()));
glBindVertexArray(i->getMesh()->vao);
glDrawElements(GL_TRIANGLES, i->getMesh()->nbVertices, GL_UNSIGNED_INT, 0);
}
我知道繪制操作可以正常工作,因為我在程序的另一部分中將它與陰影貼圖一起使用了。
最后,我嘗試從紋理讀取數據:
glMemoryBarrier(GL_SHADER_IMAGE_ACCESS_BARRIER_BIT);
static char data[VoxelSize * VoxelSize *VoxelSize] = {0};
glGetTexImage(GL_TEXTURE_3D, 0, GL_RED_INTEGER, GL_UNSIGNED_BYTE, data);
for(auto & i : data){
if(i!=5)
std::cout << (int)i << " ";
}
endl(std::cout);
如您所見,如果數據被修改,那么它將打印到cout
。 我將數據設置為5,以便可以看到glGetTexImage
實際讀取了紋理數據(因為否則它將全部為零)。
我使用的程序將此作為頂點緩沖區:
#version 430
layout(location = 0) in vec3 position;
uniform mat4 M;
void main(){
gl_Position = M* vec4(position, 1.0);
}
並將其作為片段緩沖區:
#version 430
layout(binding = 0, r8ui)writeonly restrict uniform uimage3D dataTexture;
void main(){
imageStore(dataTexture, ivec3(6,6,6), uvec4(30));
}
我使用一個任意位置進行寫入,而不是使用一個受片段本身影響的位置,這樣至少可以確保如果有任何片段通過它會影響紋理。 但是,似乎沒有任何效果。 我嘗試更改imageStore
寫入的位置,並嘗試以各種方式縮放頂點緩沖區中的gl_Position
。 任何幫助,將不勝感激。
編輯:
在遵循將分層設置從false
更改為true
的可能重復解決方案之后,它仍然不起作用。
glUseProgram(voxelProg)
和glGetUniformLocation(mainProg, "M")
引用不同的着色器程序。 因此,沒有設置矩陣M
,頂點形成了退化的三角形,並且沒有對片段進行柵格化,因此imageStore
從未真正被調用。
而且glBindImageTexture
3D紋理處理為“分層的” 2D紋理,因此layered參數必須為GL_TRUE
。 看到這個 。
[ 編輯 ]在這種情況下, M
也由於其他原因而無法正確投影幾何圖形(請參見注釋)。 若要更改M
以使其縮放並將網格轉換為-1到1的立方體以匹配3D圖像,請參見: 如何將網格標准化為-1到1,然后從標准化的網格還原為原始網格?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.