多重采样似乎不适用于片段着色器生成的片段。
在下面的示例中,片段着色器用于生成棋盘程序纹理。
正方形的外边缘已正确抗锯齿,但程序纹理的内边缘却未正确抗锯齿。
片段着色器是否仅针对每个像素进行评估?
或者给定像素的每个片段的纹理坐标是否相同?
下面是代码和image https://i.stack.imgur.com/l1T6D.png显示其输出(请注意,程序边缘(白色和灰色方块之间)没有抗锯齿,而几何边缘(黑色和白色/灰色之间)是抗锯齿的):
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# imports ####################################################################
import sys
from OpenGL.GLUT import *
from OpenGL.GL import *
# display ####################################################################
def reshape(width, height):
"""window reshape callback."""
glViewport(0, 0, width, height)
glMatrixMode(GL_PROJECTION)
glLoadIdentity()
r = float(min(width, height))
w, h = 2*width/r, 2*height/r
glOrtho(-w, w, -h, h, -1, 1)
glMatrixMode(GL_MODELVIEW)
glLoadIdentity()
glRotate(45, 0, 0, 1)
def display():
"""window redisplay callback."""
glClear(GL_COLOR_BUFFER_BIT)
glBegin(GL_TRIANGLE_STRIP)
for x in [-1, 1]:
for y in [-1, 1]:
glTexCoord(x, y)
glVertex(x, y)
glEnd()
glutSwapBuffers()
# setup ######################################################################
glutInit(sys.argv)
glutInitDisplayString(b"rgba double samples=4")
glutInitWindowSize(100, 100)
glutCreateWindow(sys.argv[0].encode())
glutReshapeFunc(reshape)
glutDisplayFunc(display)
glEnable(GL_BLEND)
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)
shader = glCreateShader(GL_FRAGMENT_SHADER)
glShaderSource(shader, """
void main() {
vec2 c = gl_TexCoord[0].xy;
vec4 color = gl_Color;
if(c.x*c.y < 0.) color.a *= .5;
gl_FragColor = color;
}
""")
glCompileShader(shader)
program = glCreateProgram()
glAttachShader(program, shader)
glLinkProgram(program)
glUseProgram(program)
glutMainLoop()