簡體   English   中英

OpenGL緩沖區屬性

[英]OpenGL Buffer to Attribute

我試圖在每個頂點的基礎上為我的頂點着色器獲取一些浮點值-浮點值將定義gl_PointSize的大小以進行渲染

這是我的着色器:

attribute float vSpacial;

void main(void)
{
   gl_FrontColor = gl_Color;
   gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
   gl_PointSize = vSpacial;
}   

這是我為頂點,顏色和“空間”點大小信息設置緩沖區的方法:

GLint spacial = glGetAttribLocation(program, "vSpacial");
float spacialData[] = {11.0f, 50.0f, 100.0f};

GLuint VBO;
glGenBuffers(1, &VBO);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(positions), &positions, GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);

GLuint CBO;
glGenBuffers(1, &CBO);
glBindBuffer(GL_ARRAY_BUFFER, CBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(colors), &colors, GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);

GLuint SPO;
glGenBuffers(1, &SPO);
glBindBuffer(GL_ARRAY_BUFFER, SPO);
glBufferData(GL_ARRAY_BUFFER, sizeof(spacial), &spacial, GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);

這是我渲染的方式:

        // Set up projection
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        gluPerspective(45, 1024.0/768.0, 1, 1000);
        // Set up camera view
        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();
        gluLookAt(0,0,-5,
                  0,0,0,
                  0,1,0);

        glClearColor( 0.0f, 0.0f, 0.0f, 0.0f );
        glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

        // ---
        glUseProgram(program);

        glPushMatrix();
        glRotatef( theta, 0.0f, 0.0f, 1.0f );

        glEnableClientState(GL_VERTEX_ARRAY);
        glEnableClientState(GL_COLOR_ARRAY);
        glEnable(GL_PROGRAM_POINT_SIZE);


        glBindBuffer(GL_ARRAY_BUFFER, VBO);
        glVertexPointer(3, GL_FLOAT, 0, BUFFER_OFFSET(0));
        glBindBuffer(GL_ARRAY_BUFFER, CBO);
        glColorPointer(3, GL_FLOAT, 0, BUFFER_OFFSET(0));

        glBindBuffer(GL_ARRAY_BUFFER, SPO);
        glEnableVertexAttribArray(spacial);
        glVertexAttribPointer(spacial, 1, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(0));

        glDrawArrays(GL_POINTS, 0, 3);

        glDisableVertexAttribArray(spacial);

        glDisable(GL_PROGRAM_POINT_SIZE);
        glDisableClientState(GL_COLOR_ARRAY);
        glDisableClientState(GL_VERTEX_ARRAY);

        glBindBuffer(GL_ARRAY_BUFFER, 0);

        glPopMatrix();

        // ---

        glFlush();
        SwapBuffers( hDC );

        theta += 1.0f;

目前,我看不到任何渲染-如果我注釋掉glBindBuffer(GL_ARRAY_BUFFER,SPO)行; 我將看到一個點被單獨渲染(不使用傳入的空間值)。

具有諷刺意味的是,立即注意到了這個問題:

我應該在BufferData調用中使用spacialData而不是spacialData。

故事的寓意:給變量取好名字,不要感到疲倦(沒喝咖啡)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM