フラグメントがマルチサンプリングされているかどうかをglslで検出するための高速な(パフォーマンスのための)方法はありますが、最初のパスがレンダリングされたテクスチャを使用して2番目の(軽い)パスで検出します。または、openglはマルチサンプリングに関する情報をどのように保存していますか?
2 に答える
それらはいくつかあります。通常は、現在の座標(gl_FragCoord)が(0.5、0.5)であることを確認します。そうである場合、それはあなたがポリゴンの真ん中にいることを意味します:それは一度だけサンプリングされます。
そうではありません。おそらく4つ(4xMSAAの場合)の回転した正方形のコーナーの1つです。あなたはエッジにあり、openGLは1つのサンプルだけでは不十分であることを検出しました。
http://www.opengl.org/pipeline/article/vol003_6/も参照してください。
ただし、この情報を2回目のパスで取得するには、情報をg-bufferに格納する必要があります。
編集:これが私が行ったばかりのコードスニペットです。1024x10244xMSAAテクスチャを使用してgtx470でテスト済み。
バーテックスシェーダー:
#version 400 core
uniform mat4 MVP;
noperspective centroid out vec2 posCentroid;
layout(location = 0) in vec4 Position;
void main(){
gl_Position = MVP * Position;
posCentroid = (gl_Position.xy / gl_Position.w)*512; // there is a factor two compared to 1024 because normalized coordinates have range [-1,1], not [0,1]
}
フラグメントシェーダー:
#version 400 core
out vec4 color;
noperspective centroid in vec2 posCentroid;
void main()
{
if (abs(fract(posCentroid.x) - 0.5) < 0.01 && abs(fract(posCentroid.y) - 0.5) < 0.01){
color = vec4(1,0,0,0);
}else{
color = vec4(0,1,0,0);
}
}
エッジは緑、ポリゴンの中心は赤です。
元の質問については、次の記事をお勧めします:http: //www.gamasutra.com/view/feature/3591/resolve_your_resolves.php
マルチサンプリングは、ピクセル形式を選択するときにコンテックスの作成時にアクティブになります。その後は、オフまたはオンにすることはできません。ただし、テクスチャにレンダリングする場合、コンテックスの設定に関係なく、OpenGLはマルチサンプリングを使用しません。