텍스처 버퍼가 있고 전체 알파가있는 검정색으로 바인딩 된 프레임 버퍼가 있고 그 프레임에 라인을 그려보십시오. 라인은 렌더링되지 않을 완전한 알파를가집니다. 나는 바보가 아니므로, 선은 확실히 검은 색이 아닙니다. 텍스처가 흰색 대신에 선이 갑자기 제대로 렌더링됩니다. 마치 뒤의 텍스처 색상이 바보 인 선의 색상에 영향을주는 것처럼 보입니다. 선들에 투명도가있는 경우에만 그 뒤에 색상이 적용되어야합니다.완전히 검은 텍스처가있는 오프 스크린 프레임 버퍼에서 라인이 렌더링되지 않습니다.
저는 회선 평활화를 사용하고 있습니다. 나는 다음의 블렌드 함수를 사용한다. 사용하는 것은 분명하다.
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
선을 그리는 코드 및/또는 관찰 한 사진을 찍는 것이 어떻습니까? 또한, 당신의 명명법은 이상합니다. 텍스처 버퍼가 프레임 버퍼에 바인드 되었습니까? 이미 프레임 버퍼에 텍스처를 그린 것입니까? – Bahbar
배경 및 선 렌더링을위한 코드를 더 게시해야합니까? –
많은 코드를 추가했습니다. 바인더 제본 질감으로 나는이 사용하는 의미 : 사용 가능 또는 GL_LINE_SMOOTH가 활성화하지 않고 GL_BLEND없이 예상대로 glFramebufferTexture2DEXT (GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, surface.texture, 0) –