Опитвам се да съхраня данни в 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
, то все още не работи.
imageStore
към върховия шейдър само като тест. - person jozxyqk   schedule 01.07.2015