OpenGLでサークルを作成する方法を見てきましたが、「ファン」メソッド(またはその派生物)を使用して、以下のメソッドを使用したことがありません。さまざまな位置に基づいて円を作成するのではなく、OpenGLファンを使用する利点は何ですか?
そうのような頂点:
#version 330 core
in vec3 apos;
in vec2 abound;
out vec3 ourColor;
out vec2 ourBound;
void main() {
gl_Position = vec4(apos, 1.0);
ourBound = abound;
}
がfiguに補間境界値をとり、次のフラグメントシェーダの作成:
float vertices[] = {
0.5f, 0.5f, 0.0f, 1.0f, 1.0f, // top right
0.5f, -0.5f, 0.0f, 1.0f, -1.0f, // bottom right
-0.5f, -0.5f, 0.0f, -1.0f, -1.0f,// bottom left
-0.5f, 0.5f, 0.0f, -1.0f, 1.0f// top left
};
は、フラグメントシェーダに変化する形式の境界情報を渡し、次の頂点シェーダを作成します中心から現行断片距離を再
#version 330 core
in vec2 ourBound;
uniform vec4 setColor;
void main() {
float dist = sqrt((ourBound.x * ourBound.x) + (ourBound.y * ourBound.y));
vec4 color_used = vec4(vec3(1.0), 0.0);
if(dist < 1.0){
color_used = setColor;
}
gl_FragColor = color_used;
}
- ロードシェーダ
- は
- 初期VBO/EBOはAPOS(= 0、ストライド= 5 *のはsizeof(フロート)をオフセット)とするためのためのオブジェクトブレンド有効
- Intialize colorLocation
- ストアVBAで
:
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
glUseProgram(shader_program);
glUniform4f(colorLocation, 0.0f, 1.0f, 0.0f, 1.0f);
glBindVertexArray(VAO);
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
glBindVertexArray(0);
は私の代わりにファンを作成するための利点を理解していません。パフォーマンス上のメリットはありますか?それは確かに簡単ではないようです。私はここでは、Google以外のソリューションを見つけることができません。
プログラム可能なパイプラインにアクセスできず、ピクセルごとの 'incircle()'チェックを実行できない場合はどうなりますか? – genpfault
@genpfault何を意味していますか?どのような状況でこれが当てはまり、それでも古くはないOpenGL標準、特に3.3+コアに適合していますか?それはあなたがシェイダーを作ることさえできないことを暗示します。このファンのパターンは、OpenGLのバージョンにかかわらず、何とか教えられているようです。 – snb
あなたがシェイダーを持っていないなら、あなたは* incircle()を使うことはできません。三角ファン方式は、固定機能パイプラインとプログラム可能パイプラインの両方で機能します。 – genpfault