2012-08-26 76 views
2

我正在学习一些OpenGL基础知识,当我决定创建一个粒子系统时,我遇到了一些问题。 当我尝试使用GL_POINT_SPRITE呈现GL_POINT时,它们不会显示在屏幕上,除非它们首先是渲染器。我使用的渲染 代码:GL_POINT_SPRITE_ARB渲染问题

glClear(GL_COLOR_BUFFER_BIT); 

    glPushMatrix(); 
    glColor3f(1.0f,1.0f,1.0f); 
    glEnable(GL_TEXTURE_2D); 
    glBindTexture(GL_TEXTURE_2D, t->id()); 
    glBegin(GL_QUADS); 
     glTexCoord2f(0.0f,0.0f); 
     glVertex2f(10,10); 

     glTexCoord2f(1.0f,0.0f); 
     glVertex2f(100,10); 

     glTexCoord2f(1.0f,1.0f); 
     glVertex2f(100,100); 

     glTexCoord2f(0.0f,1.0f); 
     glVertex2f(10,100); 
    glEnd(); 
    glDisable(GL_TEXTURE_2D); 
    glPopMatrix(); 

    glPushMatrix(); 
    glColor3f(1.0f,1.0f,1.0f); 
    glEnable(GL_TEXTURE_2D); 
    glEnable(GL_POINT_SPRITE_ARB); 
    glBindTexture(GL_TEXTURE_2D, t->id()); 
    glTexEnvf(GL_POINT_SPRITE_ARB, GL_COORD_REPLACE_ARB, GL_TRUE); 
    glPointSize(32); 
    glBegin(GL_POINTS); 
    glVertex2f(300,300); 
    glEnd(); 
    glDisable(GL_POINT_SPRITE); 
    glDisable(GL_TEXTURE_2D); 
    glPopMatrix(); 

SDL_GL_SwapBuffers(); 

这只是呈现一个纹理四而不是点。当我改变顺序时(第一个渲染点然后是四边形),它们都出现在屏幕上(纹理点和纹理四边形)。

我在这里做错了什么或者这是正确的行为?

我的电脑的一些信息migh是有帮助的 - Arch Linux的64位与AMD的Mobility Radeon HD 4550(催化剂12.6驱动程序)

+1

这是**正好**您正在运行的代码,或者是此剪切和粘贴来自不同的地方?你能显示在一个代码块中工作的确切代码,后面是在单独的块中不起作用的确切代码吗?如果这是你的真实代码,那么我认为它应该没有任何区别。 – Tim

+0

此代码在main函数的while循环中运行。其余的代码是SDL初始化并设置OpenGL ortho以正确显示二维图形,禁用深度缓冲区和加载纹理。 – winglot

回答

0

我今天有这个问题。这似乎修复它对我来说:

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT|GL_ACCUM_BUFFER_BIT|GL_STENCIL_BUFFER_BIT); 

我期望它是清除深度缓冲区做到了。我知道这是一个非常古老的问题,但只是为了防止其他人在同一个问题上磕磕绊绊......