2012-07-31 94 views
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() 

哪有我爲更小的質地獲得更好的質量?網格沒有孔,但紋理有時具有。

+0

我不確定你想要渲染什麼。 512^2紋理是否正確,你只是想讓它變小? – kolenda 2012-07-31 10:21:08

+0

沒錯,但我不想渲染512^2,然後將其調整到128^2我想直接渲染128^2。因此,我將pygame表面的寬度和高度設置爲128.對於OpenGL也是如此。但是,那麼發生這些錯誤 – glethien 2012-07-31 10:35:38

+0

沒有'錯誤' - 它只是相同的較小版本。我認爲它沒有什麼魔力 - 你需要把這些紅色的部分做得更大,以便它們在較小的紋理中可見。你能展示你使用過的模型/材料嗎?從這張照片我無法想象你在畫什麼:) – kolenda 2012-07-31 10:41:35

回答

2

我不知道你到底想要看到什麼。您繪製的三角形/立方體/等明顯小於像素/樣本大小的大小。因此,並非所有人都能看到。

這是一個標準的混疊問題:不覆蓋像素/樣本中心的三角形將不可見。這就是光柵化的本質。而解決混疊的唯一方法是增加您使用的樣本數量。您可以以更高的分辨率和縮小比例進行渲染,也可以使用MSAA或其他實際混疊技術。