2015-06-05 2 views
0

Я создаю набор классов для чтения в 3D-объектах из файлов COLLADA. Я начал с базового кода, чтобы читать в позициях и нормалях и строить их с помощью opengl. Я добавил код для масштабирования вершин и добавил весь код, который мне нужно прочитать в цвете или текстуре, связанных с каждым графическим элементом в файле COLLAD. Но теперь мне нужно добавить код, чтобы нарисовать вершины с цветом. Я создал массив объектов буфера для размещения массива цветов для каждого из массивов вершин и объектов буфера. Это код, который я должен собрать массивы из данных, которые я получаю из файла COLLADA: Имейте в виду, что я все еще создаю это, это не идеально.confused пытается рисовать цветные элементы для рисования с использованием glDrawElements с использованием вершинных и фрагментарных шейдеров

// Set vertex coordinate data 
     glBindBuffer(GL_ARRAY_BUFFER, vbosPosition[i]); 
     glBufferData(GL_ARRAY_BUFFER, col->vectorGeometry[i].map["POSITION"].size, 
      scaledData, GL_STATIC_DRAW); 
     free(scaledData); 


     loc = glGetAttribLocation(program, "in_coords");//get a GLuint for the attribute and put it into GLuint loc. 
     glVertexAttribPointer(loc, col->vectorGeometry[i].map["POSITION"].stride, col->vectorGeometry[i].map["POSITION"].type, GL_FALSE, 0, 0);//glVertexAttribPointer — loc specifies the index of the generic vertex attribute to be modified. 
     glEnableVertexAttribArray(0); 
#ifdef Testing_Mesh3D 
     PrintGLVertex(vbosPosition[i], col->vectorGeometry[i].map["POSITION"].size/4); 
#endif  // Set normal vector data 
     glBindBuffer(GL_ARRAY_BUFFER, vbosNormal[i]); 
     glBufferData(GL_ARRAY_BUFFER, col->vectorGeometry[i].map["NORMAL"].size, col->vectorGeometry[i].map["NORMAL"].data, GL_STATIC_DRAW); 
     loc = glGetAttribLocation(program, "in_normals"); 
     glVertexAttribPointer(loc, col->vectorGeometry[i].map["NORMAL"].stride, col->vectorGeometry[i].map["NORMAL"].type, GL_FALSE, 0, 0); 
     glEnableVertexAttribArray(1); 
     glBindBuffer(GL_ARRAY_BUFFER, vbosColor[i]); 
     Material* material = col->mapGeometryUrlToMaterial2Effect[col->vectorGeometry[i].id]; 
     if (material->effect1.size() > 0) 
     { 
      Effect effect1 = material->effect1[0]; 
      if (effect1.type == enumEffectTypes::color) 
      { 
       Color color = effect1.color; 
       glBufferData(GL_ARRAY_BUFFER, color.length, color.values, GL_STATIC_DRAW); 
       loc = glGetAttribLocation(program, "in_colors"); 
       glVertexAttribPointer(loc, color.length, color.type, GL_FALSE, 0, 0); 

      } 
      else 
      { 

      } 

     } 

    } 
    glBindBuffer(GL_ARRAY_BUFFER, 0); 
    glBindVertexArray(0); 
} 

// Initialize uniform data 
void Mesh3D::InitializeUniforms(GLuint program) { 

    GLuint program_index, ubo_index; 
    struct LightParameters params; 

    // Specify the rotation matrix 
    glm::vec4 diff_color = glm::vec4(0.3f, 0.3f, 1.0f, 1.0f); 
    GLint location = glGetUniformLocation(program, "diffuse_color"); 
    glUniform4fv(location, 1, &(diff_color[0])); 

    // Initialize UBO data 
    params.diffuse_intensity = glm::vec4(0.5f, 0.5f, 0.5f, 1.0f); 
    params.ambient_intensity = glm::vec4(0.3f, 0.3f, 0.3f, 1.0f); 
    params.light_direction = glm::vec4(-1.0f, -1.0f, 0.25f, 1.0f); 

    // Set the uniform buffer object 
    glUseProgram(program); 
    glGenBuffers(1, &ubo); 
    glBindBuffer(GL_UNIFORM_BUFFER, ubo); 
    glBufferData(GL_UNIFORM_BUFFER, 3 * sizeof(glm::vec4), &params, GL_STREAM_DRAW); 
    glBindBuffer(GL_UNIFORM_BUFFER, 0); 
    glUseProgram(program); 

    // Match the UBO to the uniform block 
    glUseProgram(program); 
    ubo_index = 0; 
    program_index = glGetUniformBlockIndex(program, "LightParameters"); 
    glUniformBlockBinding(program, program_index, ubo_index); 
    glBindBufferRange(GL_UNIFORM_BUFFER, ubo_index, ubo, 0, 3 * sizeof(glm::vec4)); 
    glUseProgram(program); 

Это hearder файл, содержащий две строки литералов я ЖИЛИЩНО строки, используемые для построения вершин и фрагментов шейдеров. Снова я новичок в этом и не уверен, как мне нужно изменить шейдер, чтобы включить цветные вершины, я начал с добавления ввода vec4 для четырех цветов поплавка (включая альфу). Любая помощь?

#pragma once 
#ifndef Included_shaders 
#define Included_shaders 

#include<stdio.h> 
#include<iostream> 
static std::string shaderVert = "#version 330\n" 
"in vec3 in_coords;\n" 
"in vec3 in_normals;\n" 
"in vec4 in_colors; \n"//added by me 
"out vec3 vertex_normal;\n" 
"void main(void) {\n" 
"vertex_normal = in_normals;\n" 
"gl_Position = vec4(in_coords, 1.0);\n" 
"}\n"; 

static std::string shaderFrag = "#version 330\n" 
"in vec3 vertex_normal;\n" 
"out vec4 output_color;\n" 
"layout(std140) uniform LightParameters{\n" 
"vec4 diffuse_intensity;\n" 
"vec4 ambient_intensity;\n" 
"vec4 light_direction;\n" 
"};\n" 
"uniform vec4 diffuse_color;\n" 
"void main() {\n" 
"/* Compute cosine of angle of incidence */\n" 
"float cos_incidence = dot(vertex_normal, light_direction.xyz);\n" 
"cos_incidence = clamp(cos_incidence, 0, 1);\n" 
"/* Compute Blinn term */\n" 
"vec3 view_direction = vec3(0, 0, 1);\n" 
"vec3 half_angle = normalize(light_direction.xyz + view_direction);\n" 
"float blinn_term = dot(vertex_normal, half_angle);\n" 
"blinn_term = clamp(blinn_term, 0, 1);\n" 
"blinn_term = pow(blinn_term, 1.0);\n" 
"/* Set specular color and compute final color */\n" 
"vec4 specular_color = vec4(0.25, 0.25, 0.25, 1.0);\n" 
"output_color = ambient_intensity * diffuse_color +\n" 
"diffuse_intensity * diffuse_color * cos_incidence +\n" 
"diffuse_intensity * specular_color * blinn_term;\n" 
"}\n"; 
#endif 

Наконец это Funciton я модифицирования рисовать цветные элементы

void Mesh3D::DrawToParent() 
{ 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

    // Draw elements of each mesh in the vector 
    for (int i = 0; i<nVectorGeometry; i++) 
    { 
     glBindVertexArray(vaos[i]); 
     glDrawElements(col->vectorGeometry[i].primitive/*This is 4 for GL_Triangles*/, col->vectorGeometry[i].index_count, 
      GL_UNSIGNED_SHORT, col->vectorGeometry[i].indices); 
    } 
    glBindVertexArray(0); 
    glutSwapBuffers(); 
} 

я получаю немного запутался о glVertexAttribPointer и glGetAttribLocation, хотя я думаю, что я получаю основную идею. Я использую это право.

Я правильно настроил буферный объект для цветов. Правильно ли у меня цвет для каждой вершины в этом буфере, сейчас я только поместил единственный цвет, который применяется ко всем связанным буферам в этом массиве и, вероятно, нужно изменить это?

Как я могу рисовать цветные вершины при вызове glDrawElements?

Не просто ссылайтесь на ресурсы для opengl, многие из многословных объяснений не имеют для меня никакого смысла.

+0

Kinda offtopic: вы должны хранить свои шейдеры в файлах. Делает их более легкими для кодирования, и вы можете поменять их во время выполнения, если вы их не жестко кодируете. – Joonazan

+0

Вы говорите, что не хотите ресурсов OpenGL, но попробовали ли вы это? http://www.opengl-tutorial.org/intermediate-tutorials/tutorial-9-vbo-indexing/ – Joonazan

ответ

0

Сделайте свой цвет вывода вершинного шейдера и сделайте шейдер фрагмента воспринятым как входной. Цвет будет интерполирован между вершинами.

Да, кажется, вы правильно поняли glAttribPointer.

DrawElements принимает индексы вершин, которые вы хотите нарисовать. Последний аргумент не должен содержать индексов. Вместо этого он должен быть нулевым. Индексы должны быть указаны с glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ...).

Если цветовой буфер правильно связан, вам не нужно делать какие-либо специальные идентификаторы drawElements для цветов. Шейдеры получат все разрешенные атрибуты.

Я могу помочь вам лучше, если вы запустите код, и вы расскажете мне, какие проблемы вы получите. Это также помогло бы, если бы код был легче читать. Если вы разделите его на функции длиной до десяти строк, вы можете обнаружить некоторые ошибки самостоятельно и, возможно, удалить некоторое дублирование.

+0

изменили мой код, поэтому я отправил его снова в другом вопросе вместо того, чтобы изменять этот http: // stackoverflow.com/questions/30675949/have-trouble-drawing-color-vertices-using-shader-in-opengl-to-draw-data-rea –

+0

ой, и я оставил последний аргумент, как это было, без него ничего не было нарисовано! –