2015-10-01 3 views
0

Я пытаюсь создать оболочку шейдера 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

glVertexAttribPointer функция принимает эти параметры:

недействительного glVertexAttribPointer ( индекса GLuint, размера GLint, типа GLenum, GLboolean нормализовалось, GLsizei шаг, Const GLvoid * указатель);

Я думаю, проблема в том, что вы вставляете число вершин в параметр «размер». Это не то, для чего это предназначено. Он контролирует, сколько компонентов будет иметь атрибут. Когда атрибут вершины предназначен для vec «размер» должен быть установлен на , при использовании поплавков он должен быть 1 и так далее.

РЕДАКТИРОВАТЬ: В качестве реторора Коради указал, используя 0 в качестве «шага» в этом случае.

+0

Установка шага в 0 означает, что значения атрибута плотно упакованы. Так что эта штука в порядке. –

+0

Я этого не знал, спасибо! – Kvaleya

+0

Хорошо, возможно, вы правы. Я думал, что это определяет количество элементов в буфере. Как мне сказать GL, сколько элементов есть? Это определяется параметром glBufferData, который читает «bytesForGLType * numVertices» в этом случае? – guitarflow

Смежные вопросы