多重采样似乎对片元着色器生成的片元无效。在下面的示例中,片元着色器用于生成棋盘式程序纹理。正方形的外边缘被正确地抗锯齿处理,但程序纹理的内部边缘却没有被处理。
片元着色器是每像素评估还是每个给定像素的片元的纹理坐标相同?
以下是代码,image 显示了其输出(请注意,程序边缘——白色和灰色正方形之间的边缘——没有进行抗锯齿处理,而几何边缘——黑色和白色/灰色之间的边缘——则有)。
片元着色器是每像素评估还是每个给定像素的片元的纹理坐标相同?
以下是代码,image 显示了其输出(请注意,程序边缘——白色和灰色正方形之间的边缘——没有进行抗锯齿处理,而几何边缘——黑色和白色/灰色之间的边缘——则有)。
#!/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()