0

だから、私はvboを研究していくつかの例をしようとしていますが、openglは私を殺しています。私はこのコードの動作を4時間試みてきましたが、なぜこれが動作しないのかわかりません。色の違う4つの正方形を描いてみました。しかし、を使用して描画しようとするとGL_POINTS、画面に4ポイントしか表示されず、9ポイントになるはずです。使っGL_QUADSてみても何も描かないでください。興味深いのは、この行を変更すると、次のようになります。

glDrawElements(GL_POINTS, 16, GL_UNSIGNED_BYTE, BUFFER_OFFSET(0));

これに:

glDrawElements(GL_POINTS, 64, GL_UNSIGNED_BYTE, BUFFER_OFFSET(0));

Openglは9つのドットを描画しますが、それだけ、GL_QUADSは機能しません。どうか、誰かが私にこの問題に光を当ててください、それは私を殺しています!! 完全なコードはここにあります:

#define GL_GLEXT_PROTOTYPES
#include<GL/glut.h>
#include<iostream>
using namespace std;

#define BUFFER_OFFSET(offset) ((GLfloat*) NULL + offset)

#define VERTICES 0
#define INDICES 1
#define NUM_BUFFERS 2

void init_2(){

GLuint buffers[NUM_BUFFERS];

GLfloat vertices[][3]= { 
                {0.0, 0.0,  0.0},
                {0.0, 40.0, 0.0},
                {0.0, 80.0, 0.0},
                {40.0, 0.0, 0.0},
                {40.0, 40.0, 0.0},
                {40.0, 80.0, 0.0},
                {80.0, 0.0, 0.0},
                {80.0, 40.0, 0.0},
                {80.0, 80.0, 0.0}
              };

GLuint indices[][4] = {
              {0, 1, 4, 3}, 
              {1, 2, 5, 4}, 
              {3, 4, 7, 6}, 
              {4, 5, 8, 7}
            };    

glGenBuffers(NUM_BUFFERS, buffers);

glBindBuffer(GL_ARRAY_BUFFER, buffers[VERTICES]);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);

glVertexPointer(3, GL_FLOAT, 0, BUFFER_OFFSET(0));

glEnableClientState(GL_VERTEX_ARRAY);

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, buffers[INDICES]);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);
}

void display(void){  

glPushMatrix();         
glDrawElements(GL_POINTS, 16, GL_UNSIGNED_BYTE, BUFFER_OFFSET(0));
glPopMatrix();
glutSwapBuffers();
}

void init() 
{
  glClearColor(0.0, 0.0, 0.0, 0.0);
  gluOrtho2D((GLdouble) -1.0, (GLdouble) 90.0, (GLdouble) -1.0, (GLdouble) 90.0);  
  init2();
}

int main(int argv, char** argc) {

  glutInit(&argv, argc);
  glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);
  glutInitWindowSize(500,500);
  glutInitWindowPosition(100,100); 
  glutCreateWindow("myCode.cpp");
  init();
  glutDisplayFunc(display);
  glutMainLoop();

  return 0;  
}
4

1 に答える 1

0

ここに問題があります:

GLuint indices[][4] = {
...
glDrawElements(GL_POINTS, 16, GL_UNSIGNED_BYTE, BUFFER_OFFSET(0));

GLuintインデックスを宣言しますglDrawElementsが、バイトを指定していることを伝えます。

GLuintは32ビットタイプであるため、それぞれに4バイトあります。インデックスデータは非常に小さいため、各32ビット値の下位バイトにはデータのみが含まれ、残りはゼロのままになります。

したがって、最初の4秒である最初の16バイトには、GLuint4つの個別の値しかないため、4つのポイントが表示されます。64(16 * 4)を試すと、9つのポイントすべてが表示されます。ただし、これらのポイントは多くのゼロと混ざり合っているため、としてレンダリングしようとするとGL_QUADS、何も描画されません。

于 2012-12-15T08:39:06.123 に答える