1

テクスチャへのレンダリングプロセスに問題があります。width = height = 512でシーンをレンダリングすると、エラーはほとんど発生しませんが、テクスチャとシーンが小さいほど、エラーが多くなります。エラーは、テクスチャの領域が黒であるということです。これは意味がありません。

ここにいくつかのスクリーンショットがあります

512 * 512:http ://www.ld-host.de/uploads/images/d9452fa0ba28494830fd96f0f15b9eba.png 128 * 128:http ://www.ld-host.de/uploads/images/a39c141282a622f086d4a96b070a56a3.png

これが私のコードです。テクスチャにレンダリングし、後でテクスチャを使用する方法です。

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
    glMatrixMode(GL_MODELVIEW)
    glLoadIdentity()
    gluLookAt(0,0,200,0,0,-1,0,1,0)


    self.fbos = glGenFramebuffersEXT(1)
    glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, self.fbos)
    self.depthbuffers = (glGenRenderbuffersEXT(1)
    glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, self.depthbuffers)
    glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT, width, height)
    glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, self.depthbuffers)       

    self.textures = glGenTextures(1)
    glBindTexture(GL_TEXTURE_2D, self.textures)
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER, GL_LINEAR)
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER, GL_LINEAR)
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8,  width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, None);
    glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT,  GL_TEXTURE_2D, self.textures, 0);
    glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, self.fbos);

    glEnable(GL_CLIP_PLANE0)
    glEnable(GL_CLIP_PLANE1)
    glClipPlane(GL_CLIP_PLANE0, (0,0,1,-1 * self.start + self.diff))       
    glClipPlane(GL_CLIP_PLANE1, (0,0,-1,self.start))   

    # render the mesh
    glTranslatef(-64,-64,-64)
    glEnableClientState(GL_VERTEX_ARRAY) # Enable something in OpenGL 
    glEnableClientState(GL_COLOR_ARRAY) # Enable something in OpenGL
    glBindBuffer(GL_ARRAY_BUFFER,self.vbo[1]) 
    glColorPointer(3,GL_FLOAT,0,None) # Tell OpenGL that it contains only ColorValues
    #Now the vertex Buffer with positions
    glBindBuffer(GL_ARRAY_BUFFER,self.vbo[0]) 
    glVertexPointer(3,GL_FLOAT,0,None) # Tell OpenGL that it contains the Positions for each Points
    glDrawArrays(GL_TRIANGLES,0,len(self.verts)+len(self.color))    # Merge both

    glDisableClientState(GL_COLOR_ARRAY); 
    glDisableClientState(GL_VERTEX_ARRAY);
    glDisable(GL_CLIP_PLANE0)
    glDisable(GL_CLIP_PLANE1)
    glBindTexture(GL_TEXTURE_2D,0)
    glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); 

    #Plane for showing texture
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
    glMatrixMode(GL_MODELVIEW)
    glLoadIdentity()
    gluLookAt(0,0,1,0,0,0,0,1,0)
    glClearColor(1,1,1,0)

    glEnable(GL_TEXTURE_2D)

    glBindTexture(GL_TEXTURE_2D, self.textures)
    glBegin(GL_QUADS)
    glNormal3f(0.0, 1.0, 0.0)
    glTexCoord2f(0.0, 0.0)
    glVertex3f(-1, 1, -1)
    glTexCoord2f(1.0, 0.0)
    glVertex3f(1, 1, -1)
    glTexCoord2f(1.0, 1.0)
    glVertex3f(1, -1, -1)
    glTexCoord2f(0.0, 1.0)
    glVertex3f(-1, -1, -1)
    glEnd();
    glDisable(GL_TEXTURE_2D)

    pygame.display.flip()

小さいテクスチャでより良い品質を実現するにはどうすればよいですか?メッシュには穴がありませんが、テクスチャに穴がある場合があります。

4

1 に答える 1

2

あなたが何を期待しているのか正確にはわかりません。ピクセル/サンプルサイズのサイズよりも明らかに小さい三角形/立方体/などを描いています。したがって、それらのすべてが表示されるわけではありません。

これは標準的なエイリアシングの問題です。ピクセル/サンプルの中心を覆わない三角形は表示されません。それがラスタライズの性質です。エイリアシングを修正する唯一の方法は、使用するサンプル数を増やすことです。より高い解像度とダウンスケールでレンダリングするか、MSAA または別の実際のエイリアシング手法を使用できます。

于 2012-07-31T22:29:04.167 に答える