2016-08-31 3 views
0

In meinem Basisprogramm (C++/OpenGL 4.5) ich den Inhalt des Vertex Buffer zu einem Shader Lagerpuffer (SSBO) kopiert haben:Ändern eines Shader Speicherpuffer-Objekt aus einem Vertex Shader

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); 

im Vertex Shader werden diese Daten an ein Array gebunden:

#version 430 
#extension GL_ARB_shader_storage_buffer_object : require 

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

Aber wenn ich versuche, ein Array-Eintrag in derzu überschreibenFunktion wie folgt:

array[index_in_bounds] = 4.2; 

passiert nichts.

Was mache ich falsch? Kann ich den Puffer innerhalb des Vertex-Shaders ändern? Ist das nur in einem Geometry Shader möglich? Muss ich das mit Transform Feedback machen (das habe ich noch nie benutzt)?

edit: ich die Abbildung der Puffer für Testzwecke in meinem Hauptprogramm, nur um zu sehen, ob sich die Daten ändern:

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

definieren Zeigen Sie den Code, in dem Sie feststellen, ob etwas passiert ist oder nicht. –

+0

Es ist offensichtlich, wie ich das Array für Transformationen verwende. Ich habe meinen Debug-Ausgangscode hinzugefügt. – Corbie

+0

Bitte poste ein [mcve]. –

Antwort

0

Okay, ich habe das Problem mit dem roten Buch gefunden. Ich habe nicht den Puffer richtig und Bindung der Pufferbasis hat gebunden nach Puffern der Daten geschehen: „nichts passiert“

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); 
Verwandte Themen