Python 渲染到纹理-细节级别

Python 渲染到纹理-细节级别,python,opengl,textures,Python,Opengl,Textures,我的“渲染到纹理”过程有问题。当我使用width=height=512渲染场景时,它几乎没有错误,但是纹理和场景越小,错误就越多。 错误在于纹理的区域是黑色的,这是没有意义的 这里是一些截图 512*512: 128*128: 下面是我的代码,我如何渲染到纹理并在以后使用纹理 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) glMatrixMode(GL_MODELVIEW) glLoadIdentity()

我的“渲染到纹理”过程有问题。当我使用width=height=512渲染场景时,它几乎没有错误,但是纹理和场景越小,错误就越多。 错误在于纹理的区域是黑色的,这是没有意义的

这里是一些截图

512*512: 128*128:

下面是我的代码,我如何渲染到纹理并在以后使用纹理

    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()

如何为较小的纹理获得更好的质量?网格没有洞,但纹理有时会有。

我不知道您希望看到什么。您正在绘制的三角形/立方体等明显小于像素/样本大小。因此,并非所有这些都是可见的


这是一个标准的别名问题:不覆盖像素/样本中心的三角形将不可见。这就是光栅化的本质。修复别名的唯一方法是增加使用的样本数。您可以以更高的分辨率和更小的比例渲染,也可以使用MSAA或其他真实的锯齿技术。

我不确定您尝试渲染什么。512^2纹理正确吗?您只想将其缩小?没错,但我不想渲染512^2,然后将其大小调整为128^2。我想直接渲染128^2。因此,我将pygame曲面的宽度和高度设置为128。OpenGL也是如此。但是,这些错误发生了,没有“错误”,只是相同错误的较小版本。我认为这里面没有魔法——你需要把那些红色的部分做得更大,这样它们就可以在更小的纹理中看到。你能展示一下你用过的模型/材料吗?从这些图片中我无法想象你画的是什么:)它是一个球体。我用MarchingCUbes生成了这个网格。每个顶点都有一种颜色。在渲染过程中,我使用glClipPlane将其切割成128或512个(取决于长度)切片,这是我以后计算所需的-球体的半径为128,如果使用较少的切片,您将在单个图像上获得更多的几何体。