2016-12-12 2 views
0

계산 쉐이더에서 imageStore을 사용하여 깊이있는 텍스처에 어떻게 쓰는지, 몇 가지 예제 (예 : thisthis), 그러나 나는 아직도 결함을 발견 할 수 없다. 텍스처에 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가 손실되는 버그가 없음을 확신합니다./변경됨.

답변

3

내가 할 수없는 당신이 수 없습니다 때문이다 컴퓨 트 쉐이더

내 imageStore를 사용하여 (깊이) 질감에 기록하는 방법을 나에게 운동의 생활.

Image Load/Storecolor image formats을 읽고 쓸 때만 사용할 수 있습니다. 심도 및 스텐실 형식에서는 사용할 수 없습니다.

아니요. glCopyImageSubData을 사용하여 색상 및 심도 이미지간에 복사 할 수 없습니다. 계산 쉐이더는 깊이/스텐실 형식을 읽을 수 있지만 image 변수를 통해서가 아니라 sampler을 통해서만 읽을 수 있습니다.

+0

감사의 말로, 'GL_DEPTH_COMPONENT32F'는 뷰포트 (계산 쉐이더에서는 사용할 수 없음)를 기반으로 자동으로 표준화되지만,'r32f'로 충분하다고 가정 했었습니다. 그것은 수치 스럽습니다. 따라서 컴퓨터 쉐이더로 흐리게 처리하기 위해 깊이/그림자 맵을 컬러 첨부 파일로 만들어야합니다. – Robadob