多重採樣似乎不適用於由片段着色器生成的片段。 在下面的示例中,片段着色器用於生成檢查板程序紋理。 正方形的外邊緣適當反鋸齒,但程序紋理的內邊緣不是。多重採樣和片段着色器
片段着色器僅對每個像素進行評估嗎? 或者給定像素的每個片段的紋理座標是否相同?
下面是代碼和image示出它的輸出(注意-between白色和灰色正方形程序邊緣不抗鋸齒,而幾何邊緣-between黑白/格雷是):
#!/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()
這是哪一種語言? – Vallentin
python/python3與pyopengl,但問題是不依賴於語言。如果有幫助,我可以添加一個C版本。 – rndblnch
好吧,看起來像我需要[sample_shading](http://www.opengl.org/registry/specs/ARB/sample_shading.txt)擴展名: 「在標準多重採樣渲染中,允許實現分配相同的顏色和紋理座標值,然後允許進行優化,其中着色器只被評估一次,然後分佈到已確定被當前被柵格化的圖元覆蓋的樣本。「 – rndblnch