3

h高さ、半半径の円柱面に均一なチェッカーボード テクスチャを適用したいと考えています(a,b)

このシェーダーを実装しました:

頂点シェーダー:

varying vec2 texture_coordinate;
float twopi = 6.283185307;
float pi=3.141592654;

float ra = 1.5;
float rb= 1.0;

void main()
{
// Transforming The Vertex
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
// -pi/2 < theta < pi/2
float theta =  (atan2( rb*gl_Vertex.y , ra*gl_Vertex.x)+pi*0.5)/pi;

// Passing The Texture Coordinate Of Texture Unit 0 To The Fragment Shader
    texture_coordinate = vec2(  theta , -(-gl_Vertex.z+0.5) );
}

フラグメント シェーダー:

varying vec2 texture_coordinate;
uniform sampler2D my_color_texture;
void main()
{
    // Sampling The Texture And Passing It To The Frame Buffer
    gl_FragColor = texture2D(my_color_texture, texture_coordinate);
}

クライアント側では、次のオプションを指定しました。

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);

私のテクスチャは 3768x1200 のチェッカーボードです。ここで、チェッカーボードを均一に保つためにテクスチャを適用したいと思います (ストレッチのない正方形) が、サーフェスの湾曲の少ない部分でのみ正しい縦横比を取得し、より湾曲した部分ではタイルが引き伸ばされます。

テクスチャを歪ませたり引き伸ばしたりせずにテクスチャを適用する方法を理解したいと思います。おそらく、テクスチャを引き伸ばす代わりに繰り返します。

最初の画像では、湾曲の少ない部分のタイルは正方形です

曲率が高いところでは、より引き伸ばされます

また、2 つの境界が交差するテクスチャの境界で奇妙なちらつきの問題があります。それを解決するにはどうすればよいですか (2 番目の画像で確認できます)。

4

1 に答える 1

2

テクスチャ座標を変更して、オブジェクト上で少し「縮小」することができます。できないことは、テクスチャ座標をパラメータ化して非線形にスケーリングすることです。

したがって、オプションは次のとおりです。

  1. サンプリングを量子化し、テクスチャ座標を変更して、非円形性をより適切に調整します (動的ですが、ローポリ テッセレーションを使用すると品質が低下します。ただし、実装するのが最も簡単なソリューションです)。
  2. フラグメント シェーダーを使用して、テクスチャ座標を非線形にスケーリングします (おそらくもう少し複雑ですが、動的であり、テクスチャ サイズ、使用するフィルタリング、およびテクスチャ コンテンツによっては、非常に良い結果が得られます( ! ) ) 。
  3. テクスチャを変更します (静的ソリューション - 特定の Ra/Rb 比でのみ機能します。ただし、品質は可能な限り最高になります)。

境界のちらつきに関しては、テクスチャのミップマップを生成する必要があります。

さらに情報が必要な場合はお知らせください。

于 2012-08-14T13:42:15.233 に答える