계산 쉐이더에서 imageStore
을 사용하여 깊이있는 텍스처에 어떻게 쓰는지, 몇 가지 예제 (예 : this 및 this), 그러나 나는 아직도 결함을 발견 할 수 없다. 텍스처에 Framebuffer로 쓸 수 있고 glTexImage2D()
을 호출 할 때이 계산 쉐이더를 실행해도 이름이 지정된 텍스처 (스크린에 렌더링을 통해 확인)에 영향을 미치지 않습니다.imageStore에서 계산 쉐이더 깊이 쉐이핑으로
위의 내용이 적용되는 경우 아래에서 허용되는 답변을 건너 뛸 수 있습니다. 나는 명확한 형식으로 관련 코드를 추출했습니다 아래
, 그것은 오류 검사의 무리와 함께 클래스에 공통 GL 작업을 래핑 훨씬 더 큰 프로젝트의 일부입니다. 그러나 나는 the project이라고 쓰여졌습니다. 그래서 나는 무엇이 무엇인지 알고 있고 부름을받지 않습니다.
나는 계산 쉐이더를 가지고 있는데, 이것은 매우 간단합니다. 모든 픽셀에 0.5f
을 써야합니다. 디버깅 렌더링에서 시안 색으로 출력됩니다.
#version 430
layout(local_size_x=16,local_size_y=16) in;
uniform uvec2 _imageDimensions;
uniform layout (r32f) writeonly image2D _imageOut;
void main()
{
if(gl_GlobalInvocationID.x<_imageDimensions.x
&&gl_GlobalInvocationID.y<_imageDimensions.y)
{
imageStore(_imageOut, ivec2(gl_GlobalInvocationID.xy), vec4(0.5f));
}
}
나는
glm::uvec2 shadowDims = glm::uvec2(4096);
GLuint shadowOut;
glGenTextures(1, &shadowOut);
glBindTexture(GL_TEXTURE_2D, shadowOut);
glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT32F, shadowDims.x, shadowDims.y, 0, GL_DEPTH_COMPONENT, GL_FLOAT, 0);
glBindTexture(GL_TEXTURE_2D, 0);
내가
glUseProgram(computeShader)
//Dimensions
GLint location = glGetUniformLocation(computeShader, "_imageDimensions");
glUniform2uiv(location, 1, glm::value_ptr(shadowDims));
//Image unit
const int IMAGE_UNIT = 0;
location = glGetUniformLocation(computeShader, "_imageOut");
glUniform1iv(location , 1, &IMAGE_UNIT);
glUseProgram(0)
를 사용하여 쉐이더를 구성하고 마지막으로 내가 해봤
glUseProgram(computeShader)
glBindImageTexture(IMAGE_UNIT, shadowOut, 0, GL_FALSE, 0, GL_WRITE_ONLY, GL_R32F);
//Split the image into work groups of size 16x16
glm::uvec2 launchConfig = shadowDims/ glm::uvec2(16) + glm::uvec2(1);
glDispatchCompute(launchConfig.x, launchConfig.y, 1);
//Synchronise written memory
glMemoryBarrier(GL_SHADER_IMAGE_ACCESS_BARRIER_BIT);
와 쉐이더를 실행하여 텍스처를 만들 몇 가지 조정할 수 있지만, 내가하는대로 , 텍스처는 렌더링을 유지하지만 처음에는 초기화 할 때 텍스처를 구성합니다.
GL 오류가 발생하지 않습니다. (모든 gl fn과 함께 전 처리기 매크로가 있습니다.) 실제로 실행 된 코드가 위에 제공된 것보다 추상적이지만, vars가 손실되는 버그가 없음을 확신합니다./변경됨.
감사의 말로, 'GL_DEPTH_COMPONENT32F'는 뷰포트 (계산 쉐이더에서는 사용할 수 없음)를 기반으로 자동으로 표준화되지만,'r32f'로 충분하다고 가정 했었습니다. 그것은 수치 스럽습니다. 따라서 컴퓨터 쉐이더로 흐리게 처리하기 위해 깊이/그림자 맵을 컬러 첨부 파일로 만들어야합니다. – Robadob