2016-02-02 2 views
0

Сейчас я изучаю OpenGL, и я хочу нарисовать пирамиду, где каждая сторона имеет другой цвет. Проблема, с которой я сталкиваюсь, заключается в том, что я только могу назначить цвета вершинам, а не сторонам. Поэтому каждая сторона имеет эффект градиента, а не сплошной цвет. Как я могу дать своим сторонам сплошной цвет?OpenGL, как дать сторонам пирамиды сплошные цвета

void init_buffer() 
    { 
     glGenBuffers(1, &(b.trifan)); 
     glBindBuffer(GL_ARRAY_BUFFER, b.trifan); 

     GLfloat trifan[6][3] = 
     { 
      {0.0, 1.0, 0.0}, 
      {1.0, 0.0, 1.0}, 
      {-1.0, 0.0, 1.0}, 
      {-1.0, 0.0, -1.0}, 
      {1.0, 0.0, -1.0}, 
      {1.0, 0.0, 1.0} 
     }; 

     glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat) * 3 * 6, trifan, GL_STATIC_COPY); 


     //base of the pyramid as 2 triangles 
     glGenBuffers(1, &(b.tribase)); 
     glBindBuffer(GL_ARRAY_BUFFER, b.tribase); 
     GLfloat tribase[4][3] = 
     { 
      {1.0, 0.0, -1.0}, 
      {-1.0, 0.0, -1.0}, 
      {1.0, 0.0, 1.0}, 
      {-1.0, 0.0, 1.0} 
     }; 
     glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat) * 4 * 3, tribase, GL_STATIC_COPY); 

     //colors 
     glGenBuffers(1, &b.colors); 
     glBindBuffer(GL_ARRAY_BUFFER, b.colors); 
     GLfloat colors[6][3] = 
     { 
      {1.0, 0.0, 0.0}, 
      {1.0, 0.0, 0.0}, 
      {1.0, 0.0, 0.0}, 
      {1.0, 0.0, 1.0}, 
      {0.5, 0.0, 1.0}, 
      {1.0, 0.0, 0.5}, 
     }; 
     glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat) * 3 * 6, colors, GL_STATIC_COPY); 

     check_errors(); 
    } 


... 
//Inside my display function 
glEnableClientState(GL_COLOR_ARRAY); 
    glEnableClientState(GL_VERTEX_ARRAY); 
    { 
     glBindBuffer(GL_ARRAY_BUFFER, b.trifan); 
     glVertexPointer(3, GL_FLOAT, 0, 0); 

     glBindBuffer(GL_ARRAY_BUFFER, b.colors); 
     glColorPointer(3, GL_FLOAT, 0, 0); 

     glDrawArrays(GL_TRIANGLE_FAN, 0, 6); 

     glBindBuffer(GL_ARRAY_BUFFER, b.tribase); 
     glVertexPointer(3, GL_FLOAT, 0, 0); 
     glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); 
    } 
    glDisableClientState(GL_COLOR_ARRAY); 
    glDisableClientState(GL_VERTEX_ARRAY); 
+1

Возможно, вам необходимо дублировать вершины, чтобы вы могли указать один цвет для каждого лица. –

+0

Это кажется неэффективным – chasep255

+0

Это единственный способ, как вы можете это сделать. – BDL

ответ

1

Вы можете дублировать вершины для каждого лица, как уже было предложено в комментариях. То же самое можно достичь и с использованием разных текстур (растровых изображений) для каждого лица без дублирования вершин.

Обратитесь к

http://oglsuperbible5.googlecode.com/svn/trunk/Src/Chapter05/Pyramid/Pyramid.cpp

Рисунок на https://www.scss.tcd.ie/Michael.Manzke/CS7055/Lab2/SuperBible.4th.Ed.Ch8-9.pdf

Примечание: superbible ссылка имеет только одну текстуру отображенный на всех лицах, поэтому дополнительный код должен быть записан на карту различные текстуры для разных граней ,

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