2011-11-07 52 views
2

我用下面的代碼製作了一個帶紋理的多維數據集,但頂點到達查看器越近,獲得的透明度就越高。另外,紋理似乎完全看不見。OpenGL中不需要的透明度

float rot = 0.01; 

@implementation ECGameView 

- (void)prepareOpenGL { 
    glShadeModel(GL_SMOOTH); 
    glClearColor(0.0, 0.0, 0.0, 0.0); 

    glEnable(GL_NORMALIZE); 
    glEnable(GL_DEPTH_TEST); 
    glEnable(GL_COLOR_MATERIAL); 
    glEnable(GL_LIGHTING); 
    glEnable(GL_LIGHT0); 
    glEnable(GL_TEXTURE_2D); 
    glEnable(GL_CULL_FACE); 
    glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_ARB); 

    GLfloat mat_specular[] = { 1.0, 1.0, 1.0, 1.0 }; 
    GLfloat mat_shininess[] = { 50.0 }; 
    GLfloat lightPosition[] = { 1.0, 1.0, 1.0, 0.0 }; 
    GLfloat white_light[] = { 1.0, 1.0, 1.0, 1.0 }; 
    GLfloat lmodel_ambient[] = { 0.1, 0.1, 0.1, 1.0 }; 

    glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular); 
    glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess); 
    glLightfv(GL_LIGHT0, GL_POSITION, lightPosition); 
    glLightfv(GL_LIGHT0, GL_DIFFUSE, white_light); 
    glLightfv(GL_LIGHT0, GL_SPECULAR, white_light); 
    glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient); 

    NSImage * texImg = [NSImage imageNamed:@"texture.png"]; 
    glGenTextures(1, &texture); 
    glBindTexture(GL_TEXTURE_2D, texture); 
    NSBitmapImageRep * bitmap = [NSBitmapImageRep imageRepWithData:[texImg TIFFRepresentation]]; 
    glTexImage2D(GL_TEXTURE_2D, 0, 3, [texImg size].width, [texImg size].height, 0, GL_RGB, GL_UNSIGNED_BYTE, [bitmap bitmapData]) ; 
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); 
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); 

    updateTimer = [NSTimer scheduledTimerWithTimeInterval:.05 target:self selector:@selector(update:) userInfo:nil repeats:TRUE]; 
} 

- (void) update:(NSTimer*)timer; { 
    [self setNeedsDisplay:TRUE]; 
} 

- (void)reshape { 
    NSSize size = self.bounds.size; 
    glViewport(0,0, size.width, size.height); 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    gluPerspective(45.0f, size.width/size.height, 0.1, 100.0); 
    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 
    glTranslatef(0.0, 0.0, -10.0); 
} 

- (void)drawRect:(NSRect)rect { 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

    glBindTexture(GL_TEXTURE_2D, texture); 

    glRotatef(rot, 1, 0, 1); 
    rot = (rot + .01); 

    static GLfloat vertices[] = {1.0, 1.0, 1.0, -1.0, 1.0, 1.0, -1.0, -1.0, 1.0, 1.0, -1.0, 1.0, 
    1.0, 1.0, -1.0, -1.0, 1.0, -1.0, -1.0, -1.0, -1.0, 1.0, -1.0, -1.0, 
    1.0, 1.0, 1.0, 1.0, -1.0, 1.0, 1.0, -1.0, -1.0, 1.0, 1.0, -1.0, 
    -1.0, -1.0, 1.0, -1.0, -1.0, -1.0, 1.0, -1.0, -1.0, 1.0, -1.0, 1.0, 
    -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, 1.0, -1.0, 
    -1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, -1.0, 1.0, 1.0}; 

    static GLfloat normals[] = {1.0, 1.0, 1.0, -1.0, 1.0, 1.0, -1.0, -1.0, 1.0, 1.0, -1.0, 1.0, 
    1.0, 1.0, -1.0, -1.0, 1.0, -1.0, -1.0, -1.0, -1.0, 1.0, -1.0, -1.0, 
    1.0, 1.0, 1.0, 1.0, -1.0, 1.0, 1.0, -1.0, -1.0, 1.0, 1.0, -1.0, 
    -1.0, -1.0, 1.0, -1.0, -1.0, -1.0, 1.0, -1.0, -1.0, 1.0, -1.0, 1.0, 
    -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, 1.0, -1.0, 
    -1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, -1.0, 1.0, 1.0}; 

    static const GLfloat texCoords[] = { 
    0.0, 0.0, 
    0.0, 1.0, 
    1.0, 1.0, 
    1.0, 0.0, 
    0.0, 0.0, 
    0.0, 1.0, 
    1.0, 1.0, 
    1.0, 0.0, 
    0.0, 0.0, 
    0.0, 1.0, 
    1.0, 1.0, 
    1.0, 0.0, 
    0.0, 0.0, 
    0.0, 1.0, 
    1.0, 1.0, 
    1.0, 0.0, 
    0.0, 0.0, 
    0.0, 1.0, 
    1.0, 1.0, 
    1.0, 0.0 
    }; 

    glEnableClientState(GL_VERTEX_ARRAY); 
    glEnableClientState(GL_NORMAL_ARRAY); 
    glEnableClientState(GL_TEXTURE_COORD_ARRAY); 

    glVertexPointer(3, GL_FLOAT, 0, vertices); 
    glNormalPointer(GL_FLOAT, 0, normals); 
    glTexCoordPointer(2, GL_FLOAT, 0, texCoords); 
    glDrawArrays(GL_QUADS, 0, 24); 

    glDisableClientState(GL_VERTEX_ARRAY); 
    glDisableClientState(GL_NORMAL_ARRAY); 
    glDisableClientState(GL_TEXTURE_COORD_ARRAY); 

    glFlush(); 
} 

所有附圖中ECGameView完成,這是NSOpenGLView的子類,與在標頭中Gluint變量。有人有任何想法嗎?順便說一句,我知道這是很多代碼,但我真的不知道什麼是錯的,所有這些東西似乎都適用。

編輯:我只是刪除了我的代碼中的着色,它顯示了一個橙色的立方體。我認爲這意味着紋理有點工作(下面的紋理,從http://www.nullterminator.net/gltexture.html)。

The texture I am using for this test

編輯2:幫我想出解決辦法。紋理問題已解決,但他們問題我問的是而不是。我在立方體的一側出現了一個奇怪的洞。代碼已經更新

Strange hole

編輯3:我想通了,爲什麼它正在做的事情,但我不知道如何解決它。它在平面的錯誤一側(立方體的背面)上繪製紋理。我怎樣才能使它在正確的方面畫畫?

+0

你確定它們變得透明嗎?你有沒有嘗試改變背景看他們是否真的變得透明或者變暗?如果它們變暗,那是因爲你的照明。 – Shahbaz

+0

你是什麼意思紋理是不可見的?你的意思是你看到的立方體只是顏色而不是紋理?或者當紋理上的整個對象以某種方式不可見時? – Shahbaz

+0

您是否設置了紋理環境模式? –

回答

1

我在任何地方都看不到紋理。 glEnable(GL_TEXTURE_2D);

編輯:我也認爲你需要24(s,t)紋理座標對。

最後:看起來你沒有啓用背面剔除:glEnable(GL_CULL_FACE); 你也應該看看glPolygonMode,如果頂點順序(繞組)的面不是CCW(逆時針)默認情況下。

+0

謝謝。紋理仍然不顯示。 – Justin

+0

我怎麼把這些放進去?我不知道「24(s,t)紋理座標對」 – Justin

+1

@Justin是什麼意思:你只提供了第一個GL_QUAD的紋理座標。你想再做5次。 GL可能正在讀取texCoords數組末尾的垃圾。 –