テクスチャがバインドされたフレーム バッファがあり、それが単に黒で完全なアルファであり、それに線を描画しようとすると、線が完全なアルファを持っていてもレンダリングされません。私はバカではないので、線は絶対に黒ではありません。代わりに、テクスチャが白の場合、その背後のテクスチャの色がダムの線の色に影響を与えるかのように、線が突然正しくレンダリングされます。線が透過性を持っている場合にのみ、線の背後の色が効果を持つべきです。
ラインスムージングを使用しています。どうやら使用するものである次のブレンド関数を使用します。
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)
これを修正するにはどうすればよいですか?
多くのコード:
線を引く場合:
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.
フレームバッファ オブジェクトの設定:
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 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
フレーム バッファ オブジェクトを使用して、画面または 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