球はテクスチャでレンダリングされたときにポリゴンを明らかにします -- 3d フィールド と xna フィールド と direct3d フィールド と phong フィールド 関連 問題

Sphere reveals polygons when rendered with a texture












1
vote

問題

日本語

XNA / D3D(DX11)のビリヤードボールをレンダリングしていかがいんでいます。私はHLSLのSamplerStateを使用してVisualStudio2012で生成された球FBXにMy BilliardテクスチャをマッピングするBlinn-Phoneシェーダを書いています。

私が2つの問題があり、下の写真の右端のボールに最も目に見える。

1)球の基礎となる多角形がある場所が明らかにされているのを見ることができます。
2)3番目の行の下端で、ほんの少し白がストライプの下に表示されている、それは非常にエイリアスまたはギザギザに見えます。

テクスチャアプリケーションは、頂点の法線間の補間がパイプライン内で行われているので、私のコントロールを超えているようです。

だから、どうやってこれを改善できますか?より多くのポリゴンを持つ新しい球を生成しますか?

アンチエイリアスのために次のことをしましたが、率直に言ってそれは何もしていなければほとんどやっているようでした:

<事前> <コード> graphics.PreferMultiSampling = true; graphics.ApplyChanges(); GraphicsDevice.PresentationParameters.MultiSampleCount = 4;

ここに私のテクスチャマップの様子があります。どんなアイデアも大いに感謝されます。もっと情報が必要な場合は、お知らせください!

<事前> <コード> sampler2D ColorSampler = sampler_state { Texture = <ColorTexture>; FILTER = MIN_MAG_MIP_LINEAR; AddressU = Wrap; AddressV = Wrap; };

ビリヤードボールレンダリング

英語

I've been tinkering with rendering billiard balls in XNA/D3D (DX11). I've written a Blinn-Phone shader that uses SamplerState in the HLSL to map my billiard textures to a sphere FBX that I generated in VisualStudio2012.

There are two problems I'm having, both most visible on the rightmost ball in the picture below.

1) You can see the texture reveals where the underlying polygons of the sphere are.
2) At the bottom edge of the third line where just a little white is visible below the stripe, it looks very aliased or jagged.

The texture application seems to be largely beyond my control, as the interpolation between the vertex normals is done within the pipeline, not by me.

So, how could I improve this? Generate a new sphere with more polygons?

I've done the following for the antialiasing, but frankly it seemed to do very little if anything:

        graphics.PreferMultiSampling = true;         graphics.ApplyChanges();         GraphicsDevice.PresentationParameters.MultiSampleCount = 4; 

Here's my texture map state, for what its worth. Any ideas would be greatly appreciated. If you need more info, let me know!

sampler2D ColorSampler = sampler_state {     Texture = <ColorTexture>;     FILTER = MIN_MAG_MIP_LINEAR;     AddressU = Wrap;     AddressV = Wrap; }; 

Billiard Balls Rendered

</div
           

回答リスト

1
 
vote
vote
ベストアンサー
 

Rahulの答えを補完するために、3番目の、より多くの関与オプションがあります(私は間違いなく多角形の数を増やすために絶対に選択されます)。 あなたはあなたがシェーダーを使っていると言った - そして私はあなたがピクセルシェーダについて話していると思います。この問題は、テクスチャ座標がピクセルシェーダ内の三角形の内側に直線的に補間されているために発生します。ただし、右下を扱っているが球体を扱っていることを手動で計算することが可能になります。シェーダ(標準ACO(Z)とATAN(Y / X)の式を使用して、(x、y、z)点がオブジェクト座標でラスタライズされている現在のポイントです。

それを使用して、非常に粗いテッセレーションされた球を使用していても、それでも比較的滑らかなテクスチャを得ることができるはずです。

edit :私は手元に狙撃を持っていませんが、ここでは疑似コードです:

頂点シェーダ:
- 現在の頂点の初期座標を取ります(マトリックス変換なしで、球の頂点が原点の周りを中心にしていると仮定します)、それらを<コード> varying vec3 P として直接ピクセルシェーダに渡します。ピクセルシェーダ:
- <コード> r = sqrt(P.x*P.x + P.y*P.y + P.z*P.z) - <コード> theta = acos(P.z/r) - <コード> phi = atan2(P.y/r, P.x/r) - <コード> u = theta*2/pi ; v = phi/(2*pi)+0.5 - TEX2D()

でテクスチャをサンプリングするには、上記(U、V)を使用してください。

実際にこれらのUV座標があなたのテクスチャがどのように生成されたかに対応することを確認する必要があるでしょうが、そうであれば、ほぼ歪みのないマッピングを得るべきです。

 

To complement Rahul's answer, there is a third, more involved option (although I would definitely opt for simply increasing the number of polygons) : you mentioned that you are using a shader - and I'll assume you're talking about a pixel shader. The issue arises because the texture coordinates are linearly interpolated inside the triangles in the pixel shader : but since you know that you are dealing with spheres, it becomes possible to manually compute the UV coordinates per pixel in the pixel shader (use the standard acos(z) and atan(y/x) formula with the (x,y,z) point being the current point rasterized in the object coordinate).

Using that, even if you use a very coarsely tesselated sphere, your should still be able to get relatively smooth textures.

EDIT: although I don't have a snippet at hand, here is a pseudo code:

Vertex shader:
- take the initial coordinates of the current vertex (without any matrix transform ; I'll assume that your sphere vertices are centered around the origin) and pass them directly to the pixel shader as a varying vec3 P.

Pixel shader:
- r = sqrt(P.x*P.x + P.y*P.y + P.z*P.z)
- theta = acos(P.z/r)
- phi = atan2(P.y/r, P.x/r)
- u = theta*2/pi ; v = phi/(2*pi)+0.5
- use the (u,v) above to sample your texture in the tex2D()

You'll need to make sure that these uv coordinates indeed correspond to how your texture has been generated, but if so, you should get an almost distortion free mapping.

</div
 
 
   
   
1
 
vote

あなたはいくつかのオプションを持っています:

  1. テーテーレートをより細かくめぐる。あなたが見ているのは、区分的な平面形状を介して球体を近似する際の誤差とそれを見やすくすることはそれをより小さな部分に分割することです。

  2. あなたのテクスチャを洗練するためにあなたのテクスチャをフィルタリングする。白(ガウスのぼかしを塗ってから、テクスチャとしてぼかした画像を使用してください)。

 

You have a couple of options:

  1. Tesellate more finely. What you're seeing is the error in approximating a sphere via piecewise-planar geometry and one way to make it less visible is to split it into smaller pieces.

  2. Filter your textures to have a less sharp transition from blue -> white (apply a Gaussian blur and then use the blurred image as your texture).

</div
 
 
0
 
vote

これを解決するために、VS2012の内蔵型モデルビルダーの代わりに3DSmaxを使用しました。 Sphereのスケールを2 "に設定し、セグメント数を64に増やしました.FBXにエクスポートすると、それが何であるかを知らずに「ターボスムース」を有効にしました。

最後に、それははるかに良いことがわかります:

画像の説明を入力します。

 

To solve this I used 3DSMax instead of the built-in model builder of VS2012. I set the scale to 2" for the sphere and increased the number of segments to 64. When exporting to FBX I enabled "Turbo Smooth" without knowing what it is.

In the end, it turns out much better:

enter image description here

</div
 
 

関連する質問

0  フォンシェーディング対テッセレーション  ( Phong shading vs tessellation ) 
私はフォンシェーディングを渡ってソースエンジンを見ていました。 desriptionは非常に似ています tesSellation 。しかし、私がそれを見たとき、私は2つを直接比較するものは本当に見つかりませんでした。今すぐDirectXテッセレーションは、HL...

1  球はテクスチャでレンダリングされたときにポリゴンを明らかにします  ( Sphere reveals polygons when rendered with a texture ) 
XNA / D3D(DX11)のビリヤードボールをレンダリングしていかがいんでいます。私はHLSLのSamplerStateを使用してVisualStudio2012で生成された球FBXにMy BilliardテクスチャをマッピングするBlinn-Phone...

11  光沢のあるPython 3D表面プロットのためのフォンシェーディング  ( Phong shading for shiny python 3d surface plots ) 
鏡面シェーディングを備えたPythonで審美的に心地よい3Dプロットを作成しようとしているので、Mayaviから3D軸と表面プロットとの両方のMATPLOTLIBを使用しようとしました。例えば、Mayavi Surf Examples Webページ: 結...

5  鏡面照明は物体の目に面していると背面の両方に表示されます  ( Specular lighting appears on both eye facing and rear sides of object ) 
フォンシェーディングの小さなテストを書いていて、鏡面コンポーネントを作動させようとしているレンガの壁に頭を叩いています。鏡面光がフロントとアンプの両方に適用されることを除いて、正しく機能するようです。物体の後部。 (対象物自体は透明で、CPU側は手動でソートさ...

2  フォンシェーディングとGouraudシェーディングの違いは何ですか?  ( What is the difference between phong shading and gouraud shading ) 
私はそれを理解しているように、 Gouraud シェーディングは各頂点ごとに明るい色を計算し、その色の補間を行いますが、 phong は各ピクセルの通常を補間して明るい色を計算します。その補間値に基づいています。 しかし、私が数学的に明るい色を導きようとしたと...

0  OpenGL Phong Shading  ( Opengl phong shading ) 
ボックスの内側を見るようにオブジェクトをレンダリングしたいです。 私はフォンシェーディングを使いました。 glPolygonMode(GL_FRONT_AND_BACK, GL_LINE) でオブジェクトを描画すると、画像は次のようになります。 しか...

6  正規分布関数における潜在的に活性なマイクロファセットの濃度  ( Concentration of potentially active microfacets in a normal distribution functio ) 
私はクック - トーランスマイクロファセットモデルを理解しようとしており、現在の分布関数 d (Beckmann、Blinn-Phong、またはGGXのどちらでも)上に貼られています。 D は、表面法線 n とdが存在する小数である m の分数です。 [0,...

1  WPFのピクセルごとの照明  ( Per pixel lighting in wpf ) 
それらのシェーダ効果を使用して、WPF 3Dアプリケーション(C#)でピクセルごとの照明を実装することができますか? 私はWPFで実行されている基本的な3Dアプリケーションを持っていますが、頂点間の斜線の色値をポリゴンの内側に補間することによってGouraud...

0  フォンシェーディングで材料係数とテクスチャを組み合わせる  ( Combine material coefficients and textures in phong shading ) 
非身体ベースの材料やテクスチャをサポートする単純なPhongシェーダを実装しようとしています。材料が各光成分のためのテクスチャを有するとしても、それぞれの材料係数がいくつかの効果を有することを望みます。私の疑問はそれらの両方を処理する方法です。私はそれらを混ぜ...

1  レイトレーシング - リフレクション  ( Ray tracing reflection ) 
私は今、Ray Tracer、反射部分に取り組んでいます。影を持つ球を作成することを含め、すべてが正しく機能しています。今、私は反射部分を実装しています。しかし、私はそれを得ることができませんでした。私のアルゴリズムは以下のとおりです。 <事前> <コード> ...




© 2022 cndgn.com All Rights Reserved. Q&Aハウス 全著作権所有