2010-01-09 4 views
1

텍스처 버퍼가 있고 전체 알파가있는 검정색으로 바인딩 된 프레임 버퍼가 있고 그 프레임에 라인을 그려보십시오. 라인은 렌더링되지 않을 완전한 알파를가집니다. 나는 바보가 아니므로, 선은 확실히 검은 색이 아닙니다. 텍스처가 흰색 대신에 선이 갑자기 제대로 렌더링됩니다. 마치 뒤의 텍스처 색상이 바보 인 선의 색상에 영향을주는 것처럼 보입니다. 선들에 투명도가있는 경우에만 그 뒤에 색상이 적용되어야합니다.완전히 검은 텍스처가있는 오프 스크린 프레임 버퍼에서 라인이 렌더링되지 않습니다.

저는 회선 평활화를 사용하고 있습니다. 나는 다음의 블렌드 함수를 사용한다. 사용하는 것은 분명하다.

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) 

어떻게 수정해야합니까? 코드의

많은 : 그리기 라인에 대한

: 추첨을하는

def create_texture(surface): 
    surface.texture = glGenTextures(1) 
    glMatrixMode(GL_MODELVIEW) 
    glLoadIdentity() #Loads model matrix 
    glBindTexture(GL_TEXTURE_2D, surface.texture) #Binds the current 2D texture to the texture to be drawn 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR) #Required to be set for maping the pixel data 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR) #Similar as above 
    if surface.data == None: 
     surf = pygame.Surface((1,1),SRCALPHA) 
     surf.fill(surface.colour[:-1]) 
     surface.data = pygame.image.tostring(surf, "RGBA") * (surface.surface_size[0] * surface.surface_size[1]) 
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, surface.surface_size[0], surface.surface_size[1], 0, GL_RGBA,GL_UNSIGNED_BYTE, surface.data) #Put surface pixel data into texture 

기능 : 질감의

def setup_framebuffer(surface): 
    #Create texture if not done already 
    if surface.texture == None: 
     create_texture(surface) 
    #Render child to parent 
    if surface.frame_buffer == None: 
     surface.frame_buffer = glGenFramebuffersEXT(1) 
    glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, surface.frame_buffer) 
    glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, surface.texture, 0) 
    glPushAttrib(GL_VIEWPORT_BIT) 
    glViewport(0,0,surface.surface_size[0],surface.surface_size[1]) 
    glMatrixMode(GL_PROJECTION) 
    glLoadIdentity() #Load the projection matrix 
    gluOrtho2D(0,surface.surface_size[0],0,surface.surface_size[1]) 

def end_framebuffer(): 
    glPopAttrib() 
    glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0) 
    glMatrixMode(GL_PROJECTION) 
    glLoadIdentity() #Load the projection matrix 
    gluOrtho2D(0,1280,720,0) #Set an orthorgraphic view 

창조 :

def draw_line(a,b,c,w,antialias): 
    if antialias: 
     glEnable(GL_LINE_SMOOTH) #Enable line smoothing. 
    c = [float(sc)/255.0 for sc in c] #Divide colours by 255 because OpenGL uses 0-1 
    if len(c) != 4: 
     c.append(1) #Add a value for aplha transparency if needed 
    glMatrixMode(GL_MODELVIEW) 
    glLoadIdentity() #Loads model matrix 
    glColor4fv(c) 
    glLineWidth(w) 
    glBegin(GL_LINES) 
    glVertex2fv(a) 
    glVertex2fv(b) 
    glEnd() 
    if antialias: 
     glDisable(GL_LINE_SMOOTH) #Disable line smoothing. 

는 프레임 버퍼 오브젝트를 설정 라인 수 화면 또는 프레임 버퍼 객체가있는 Surface 객체의 텍스처로 이동합니다.

def add_lines(surface, c, coordinates, w = 1, antialias = True): 
    if surface.__class__ == Surface: #Only use a frame buffer if the line isn't being drawn to the screen. 
     setup_framebuffer(surface) 
    last = None 
    for coordinate in coordinates: #Loop though the coordinates and draw the lines 
     if last != None: 
      draw_line(last,coordinate,c,w,antialias) 
     last = coordinate 
    if surface.__class__ == Surface: #Only use a frame buffer if the line isn't being drawn to the screen. 
     end_framebuffer() 

그게 내가 중요하다고 생각하는 것입니다. 어쩌면 초기화 코드 제외 : 당신이 당신의 초기화 코드에서 텍스처링 켜기, 그것에 대해 잊고있어 : 의심스러운 적어도 한 가지가있다

glutInit(sys.argv) 
glutInitWindowPosition(0,0) 
glutInitWindowSize(*game_size) 
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA) 
glutCreateWindow(title) 
glutSetIconTitle(title) 
glutReshapeFunc(self.reshaped) 
glutKeyboardFunc(self.keydown) 
glutKeyboardUpFunc(self.keyup) 
glutSpecialFunc(self.specialdown) 
glutSpecialUpFunc(self.specialup) 
glViewport(0,0,self.first_screen[0],self.first_screen[1]) #Creates the viewport which is mapped to the window 
glEnable(GL_BLEND) #Enable alpha blending 
glEnable(GL_TEXTURE_2D) #Enable 2D Textures 
glEnable(GL_POLYGON_SMOOTH) #Enable antialiased polygons 
glHint(GL_POLYGON_SMOOTH_HINT, GL_NICEST) 
glHint(GL_LINE_SMOOTH_HINT, GL_NICEST) 
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) 
glMatrixMode(GL_PROJECTION) 
glLoadIdentity() #Load the projection matrix 
gluOrtho2D(0,1280,720,0) #Set an orthorgraphic view 
+0

선을 그리는 코드 및/또는 관찰 한 사진을 찍는 것이 어떻습니까? 또한, 당신의 명명법은 이상합니다. 텍스처 버퍼가 프레임 버퍼에 바인드 되었습니까? 이미 프레임 버퍼에 텍스처를 그린 것입니까? – Bahbar

+0

배경 및 선 렌더링을위한 코드를 더 게시해야합니까? –

+0

많은 코드를 추가했습니다. 바인더 제본 질감으로 나는이 사용하는 의미 : 사용 가능 또는 GL_LINE_SMOOTH가 활성화하지 않고 GL_BLEND없이 예상대로 glFramebufferTexture2DEXT (GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, surface.texture, 0) –

답변

1

.

그래서 선은 텍스쳐링 (및 상수 텍스처 좌표)을 사용하여 그려지기 때문에 아마도 쓰려고하는 텍스처를 선택합니다.

이것은 원하는 것 같지 않습니다 (fbo 사양이 무엇인지 기억하지 않지만 작동하지 않습니다). 선을 렌더링 할 때 텍스처링을 해제하는 것은 어떻습니까?

+0

고맙습니다. 나는 이것을 기억할 것이다. –