Я пытаюсь создать оболочку шейдера Objective-C OpenGL на высоком уровне, которая позволяет мне выполнять различные GL-шейдеры без большого количества кода GL, который загромождает логику приложения.GLSL 3.2 сопоставление аргументов шейдера
Так что-то подобное для шейдера с двумя «в» аргументов, чтобы создать четырехугольник с различным цветом в каждом углу:
OpenGLShader* theShader = [OpenGLShaderManager shaderWithName:@"MyShader"];
glUseProgram(theShader.program);
float colorsForQuad[4] = {{1.0f, 0.0f, 0.0f, 1.0f}, {0.0f, 1.0 ....}}
theShader.arguments[@"inColor"] setValue:colorsForQuad forNumberOfVertices:4];
float positionsForQuad[4] = {{-1.0f, -1.0f, 0.0f, 1.0f}, {-1.0f, 1.0f, ....}}
theShader.arguments[@"inPosition"] setValue:positionsForQuad forNumberOfVertices:4];
glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
setValue:forNumberOfVertices:
функция выглядит следующим образом:
int bytesForGLType = numBytesForGLType(self.openGLValueType);
glBindVertexArray(self.vertexArrayObject);
GetError();
glBindBuffer(GL_ARRAY_BUFFER, self.vertexBufferObject);
GetError();
glBufferData(GL_ARRAY_BUFFER, bytesForGLType * numVertices, value, GL_STATIC_DRAW);
GetError();
glEnableVertexAttribArray((GLuint)self.boundLocation);
GetError();
glVertexAttribPointer((GLuint)self.boundLocation, numVertices,
GL_FLOAT, GL_FALSE, 0, 0);
Я думаю, проблема в том, что каждый аргумент имеет свои собственные VAO и VBO, но шейдеру нужны данные всех аргументов при его выполнении. Я могу, очевидно, связывать только один буфер за раз. Примеры, которые я видел до сих пор, используют только один VAO и один VBO и создают структуру C, содержащую все необходимые данные. Это, однако, сделало бы мой нынешний модульный подход намного сложнее.
Нет ли какой-либо опции, чтобы иметь возможность копировать данные OpenGL, чтобы она не была доступна и привязана при вызове glDraw ...?
Редактировать
Я обнаружил, что, используя общий Vertex массив объектов достаточно, чтобы решить эту проблему. Тем не менее, я был бы признателен за более глубокое понимание того, когда на самом деле копируются на GPU.
Установка шага в 0 означает, что значения атрибута плотно упакованы. Так что эта штука в порядке. –
Я этого не знал, спасибо! – Kvaleya
Хорошо, возможно, вы правы. Я думал, что это определяет количество элементов в буфере. Как мне сказать GL, сколько элементов есть? Это определяется параметром glBufferData, который читает «bytesForGLType * numVertices» в этом случае? – guitarflow