2010-08-07 116 views
0

我運行多采樣的示例,但它工作不正確似乎多采樣不應用 由於採樣緩衝區&採樣爲0. 我該怎麼做才能使它正確?多采樣opengl?

謝謝。

這是我的代碼:

在創建GLContext
#include <stdio.h> 
#include <stdlib.h> 
#include <glew.h> 
#include <GL/glut.h> 

static int bgtoggle = 1; 
void init(void) 
{ 
GLint buf, sbuf; 
int i, j; 
glClearColor(0.0, 0.0, 0.0, 0.0); 
glGetIntegerv(GL_SAMPLE_BUFFERS, &buf); 
printf("number of sample buffers is %d\n", buf); 
glGetIntegerv(GL_SAMPLES, &sbuf); 
printf("number of samples is %d\n", sbuf); 
glNewList(1, GL_COMPILE); 
for (i = 0; i < 19; i++) { 
    glPushMatrix(); 
    glRotatef(360.0*(float)i/19.0, 0.0, 0.0, 1.0); 
    glColor3f (1.0, 1.0, 1.0); 
    glLineWidth((i%3)+1.0); 
    glBegin(GL_LINES); 
    glVertex2f(0.25, 0.05); 
    glVertex2f(0.9, 0.2); 
    glEnd(); 
    glColor3f(0.0, 1.0, 1.0); 
    glBegin(GL_TRIANGLES); 
    glVertex2f(0.25, 0.0); 
    glVertex2f(0.9, 0.0); 
    glVertex2f(0.875, 0.10); 
    glEnd(); 
    glPopMatrix(); 
} 
glEndList(); 
glNewList(2, GL_COMPILE); 
glColor3f(1.0, 0.5, 0.0); 
glBegin(GL_QUADS); 
for (i = 0; i < 16; i++) { 
    for (j = 0; j < 16; j++) { 
     if (((i + j) % 2) == 0) { 
      glVertex2f(-2.0 + (i * 0.25), -2.0 + (j * 0.25)); 
      glVertex2f(-2.0 + (i * 0.25), -1.75 + (j * 0.25)); 
      glVertex2f(-1.75 + (i * 0.25), -1.75 + (j * 0.25)); 
      glVertex2f(-1.75 + (i * 0.25), -2.0 + (j * 0.25)); 
      } 
     } 
    } 
glEnd(); 
glEndList(); 
    } 
    void display(void) 
    { 
glClear(GL_COLOR_BUFFER_BIT); 
glHint(GL_LINE_SMOOTH_HINT,GL_NICEST); 
if (bgtoggle) 
    glCallList(2); 
glEnable(GL_MULTISAMPLE); 
glPushMatrix(); 
glTranslatef(-1.0, 0.0, 0.0); 
glCallList(1); 
glPopMatrix(); 
glDisable(GL_MULTISAMPLE); 
glPushMatrix(); 
glTranslatef(1.0, 0.0, 0.0); 
glCallList(1); 
glPopMatrix(); 
glutSwapBuffers(); 
    } 
    void keyboard(unsigned char key, int x, int y) 
    { 
switch (key) { 
case 'b': 
case 'B': 
    bgtoggle = !bgtoggle; 
    glutPostRedisplay(); 
break; 
case 27: /* Escape Key */ 
exit(0); 
break; 
default: 
break; 
} 
} 
int main(int argc,char** argv){ 
glutInit(&argc,argv); 
glutInitDisplayMode(GLUT_RGBA|GLUT_MULTISAMPLE|GLUT_DOUBLE|GLUT_DEPTH); 
glutInitWindowPosition(100,100); 
glutInitWindowSize(800,600); 
glutCreateWindow("MultiSample"); 
init(); 
glutDisplayFunc(display); 
glutKeyboardFunc(keyboard); 
glutMainLoop(); 
} 
+0

你用什麼編程語言? – Rekin 2010-08-07 12:27:44

+0

查看我的更新回答 – Rekin 2010-08-08 08:23:29

回答

1

設置適當的GLCapabilities。在繪製代碼之前確保有glEnable(GL_LINE_SMOOTH);glEnable(GL_MULTISAMPLE);

你嘗試過這一個:

glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_MULTISAMPLE); 
glEnable(GL_MULTISAMPLE); 

嘗試使用也glEnable(GLUT_MULTISAMPLE_ARB)代替。

+0

我測試了所有這些方法 – pooya 2010-08-08 10:19:25

+0

@pooya他們是否工作? – 2010-08-08 13:52:35

+0

不,樣本緩衝區和樣本仍然是0. 我在Linux中測試我的代碼,並再次得到相同的結果! – pooya 2010-08-08 16:46:13

0

不是那麼簡單,除了啓用多重採樣,您需要創建一個樣本> 0的OpenGL上下文,這是依賴於窗口系統和API的。如果你提供了什麼API來創建OpenGL上下文/窗口,我們將能夠告訴你它是如何完成的。

+0

我們在win32中使用過量 – pooya 2010-08-08 06:54:10

+0

我會嘗試使用另一個「框架」,GLUT實際上是一個玩具,它在多重採樣方面存在問題。我推薦SDL。 – 2010-08-08 18:05:28

+0

我可以在哪裏瞭解有關SDL的更多信息?我知道一點關於SDL我寫了超級馬里奧,但我想知道如何與openGL一起使用它?非常感謝 – pooya 2010-08-08 19:35:36