2011-11-07 13 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(); 
} 

図面の全ては、ヘッダ内Gluint変数と、NSOpenGLViewのサブクラスである、ECGameViewで行われます。誰にもアイデアはありますか?

ところで、私はそれが多くのコードであることを知っていますが、正直なところ、何が間違っているのか分からず、これらのすべてが当てはまるようです。

EDIT:コード内の色付けを削除したところ、オレンジのキューブが表示されます。私はそれがテクスチャが働いていることを意味すると思う(下のテクスチャ、http://www.nullterminator.net/gltexture.htmlから)。

The texture I am using for this test

EDIT 2:助け、私はこれを理解してください。テクスチャリングの問題は解決されましたが、私は約ではないと尋ねていました。です。私は立方体の片側に奇妙な穴ができています。それは事をやっている理由私はを考え出したが、私はそれを修正する方法がわからない:コードは

Strange hole

EDIT 3を更新されています。これは、面の反対側(立方体の裏側)にテクスチャを描画しています。正しい側をどのように描くことができますか?

+0

透明になっていますか?あなたは実際に透明になるか、あるいは暗くなるかを見て、背景を変えようとしましたか?彼らが暗くなると、それはあなたの照明のためでしょう。 – Shahbaz

+0

テクスチャが見えないのはどういう意味ですか?キューブが色でしかなく、テクスチャでは見えないのですか?または、テクスチャ化されたオブジェクト全体が何とか見えないのですか? – Shahbaz

+0

テクスチャ環境モードを設定しましたか? –

答えて

1

どこでもテクスチャが表示されません。 glEnable(GL_TEXTURE_2D);

編集:24(s、t)のテクスチャ座標のペアが必要になると思います。

は最終的に:glEnable(GL_CULL_FACE); 面の頂点順序(巻線)は、デフォルトでCCW(反時計回り)でない場合にも、glPolygonModeになります。それはあなたがバックフェースカリングを有効にしていないように見えます。

+0

ありがとうございます。まだテクスチャは表示されません。 – Justin

+0

どのようにそれらを入れるのですか?私はあなたが "24(s、t)テクスチャ座標のペア"の意味を理解していません。 – Justin

+1

@Justin:最初のGL_QUADのテクスチャ座標のみを提供しました。あなたはもう5回それをしたい。 GLはおそらくtexCoords配列の最後を過ぎてゴミを読んでいるでしょう。 –