2016-08-31 1 views
0

내에서 쉐이더 저장 버퍼 개체를 수정 :은 내가 <em>쉐이더 저장 버퍼</em> (SSBO)에 <em>버텍스 버퍼</em>의 내용을 복사 한 내 기본 프로그램 (C++/OpenGL을 4.5)에서 버텍스 쉐이더

float* buffer = (float*) glMapBuffer(GL_ARRAY_BUFFER, GL_READ_ONLY); 
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 3, ssbo[2]); 

glBufferData(GL_SHADER_STORAGE_BUFFER, sizeof(GLfloat)*size,buffer, GL_DYNAMIC_DRAW); 

glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 3, 0); 
glUnmapBuffer(GL_ARRAY_BUFFER); 
버텍스 쉐이더에서

이 데이터를 배열에 바인딩 :

#version 430 
#extension GL_ARB_shader_storage_buffer_object : require 

layout(shared, binding = 3) buffer storage 
{ 
    float array[]; 
} 

하지만 난에 배열 항목을 덮어려고 할 때은 다음과 같이 작동합니다.

array[index_in_bounds] = 4.2; 

아무 일도 발생하지 않습니다.

내가 뭘 잘못하고 있니? 버텍스 쉐이더 내에서 버퍼를 바꿀 수 있습니까? 이것은 Geometry Shader에서만 가능합니까? 이전에 사용 해본 적이없는 변형 피드백 (Transform Feedback)을해야합니까?

편집 : 내가 데이터가 변경 될 경우 바로보고, 내 메인 프로그램에서 테스트 용 버퍼를 매핑하고 있습니다 :

float* buffer = (float*) glMapBuffer(GL_ARRAY_BUFFER, GL_READ_ONLY); 
float* ssbo = (float*) glMapNamedBuffer(3, GL_READ_ONLY); 

for(int i = 0; i < SIZE_OF_BUFFERS; i++) 
    printf("% 5f | % 5f\n", ssbo[i], buffer[i]); 

glUnmapNamedBuffer(3); 
glUnmapBuffer(GL_ARRAY_BUFFER); 
+0

가 정의를 무언가가 있었는지 여부를 감지하는 코드를 보여줍니다. –

+0

변환을 위해 배열을 사용하고있는 것이 확실합니다. 디버그 출력 코드를 추가했습니다. – Corbie

+0

[mcve]를 게시하십시오. –

답변

0

좋아, 빨간 책을 사용하여 문제를 발견했다. 나는 버퍼를 올바르게 바인딩 버퍼 기반을 바인딩 데이터 버퍼링 후 을 일해야하지 ". 아무 일도 일어나지 않는다"

float* buffer = (float*) glMapBuffer(GL_ARRAY_BUFFER, GL_READ_ONLY); 
glBindBuffer(GL_SHADER_STORAGE_BUFFER, &ssbo); // bind buffer 

// switched these two: 
glBufferData(GL_SHADER_STORAGE_BUFFER, sizeof(GLfloat)*size,buffer, GL_DYNAMIC_DRAW); 
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 3, &ssbo); 

glBindBuffer(GL_SHADER_STORAGE_BUFFER, 0); // unbind buffer 
glUnmapBuffer(GL_ARRAY_BUFFER); 
관련 문제