HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2021
0407
youdaiHGIMG4でUVマップを1つのシェーダー内で複数使えるシェーダーを実装したい5未解決


youdai

リンク

2021/4/7(Wed) 09:18:49|NO.92573

HGIMG4でUVマップを1つのシェーダー内で複数使えるシェーダーを実装したいです。

例えば、UVマップ1にはディフューズ色用のUVマップを、
UVマップ2には何か別の係数用のUVマップを、という具合にです。

なんとなく、シェーダー内のa_texCoordがそのオブジェクトのUVマップの座標か何かを
表しているのかなという気がするのですが、詳しいことが分かりません。

標準シェーダーのtextured.vertを眺めていると
a_texCoordとa_texCoord1というattributeを見つけたのですが、
これがUVマップに関係するものなのでしょうか?

なんとなく、a_texCoordが1番目のUVマップで、a_texCoord1が2番目のUVマップなのかなという
気もするのですが、よく分かりません。

例えば、Blender上での1番目の段落のUVマップがa_texCoordがとして、
2番目のUVマップがa_texCoord1としてFBXに出力され、
GPBに変換される際にはそのように反映されるということなのでしょうか?



この記事に返信する


法貴優雅

リンク

2021/4/7(Wed) 21:47:10|NO.92581

詳しく調べていませんが「HGIMG4プログラミングガイド」に
現バージョンでの注意点で
マルチテクスチャ、バップマップ、ハイトマップ、LODサポート
は未実装となってることから、まだ使えないのではないかと思います。

ただし、1枚のテクスチャーに役割を分割させて、カラー、バンプ、環境マップ等を
持たせてモデルを表示することは可能です、色々、面倒くさいですが。

宣伝になってしまいますが以前HSPコンテストに投稿した「DRAGON CODE」では
一部のモデルに対して、そのような処理を行っています(water.pngとか)。
http://dev.onionsoft.net/seed/info.ax?id=1249



youdai

リンク

2021/4/7(Wed) 22:35:29|NO.92582

>マルチテクスチャ、バップマップ、ハイトマップ、LODサポート
>は未実装となってることから、まだ使えないのではないかと思います。
返信ありがとうございます。
本スレの趣旨とは少しズレますが、これらの未実装機能は標準シェーダーに対してであって、
シェーダーを自作すればこれらの機能は現在のベータ版のバージョンでも可能だと思います。
ただ、自作した場合それは標準シェーダーの仕様とはおそらく乖離するので
共有性がないという問題はあります。

バンプ、ハイトについては法線に対して加算したり、減算したり、スケーリングを大小させたりするだけなので
原理的には可能だと思います。
光源を伴ったシェーディングの場合自分の理解度レベルでは難しいのですが、光源が伴わない
例えばmatcapシェーダーの法線にノーマルマップを加算、減算したりするくらいなら
多分できるのではないかと思います。

この場合問題になるのはこのスレの趣旨とも関係あるのですが、UVマップについてであり、
ノーマルマップと通常の表面色テクスチャとで異なるUVマップを使いたい場合になります。

>ただし、1枚のテクスチャーに役割を分割させて、カラー、バンプ、環境マップ等を
>持たせてモデルを表示することは可能です、色々、面倒くさいですが。
その通りだと思います。
テクスチャを非常に工夫しないとならないため、あまり現実的な方法ではない感じがします。



法貴優雅

リンク

2021/4/7(Wed) 23:51:13|NO.92583

今テストしてみたところ、複数のテクスチャーは使えるようです。
.material内に

sampler u_bump { path = bump.png wrapS = REPEAT wrapT = REPEAT }
追加テクスチャー情報を追加した後
フラグメントシェーダーで、同名で指定すれば取得できました。

uniform sampler2D u_bump; vec4 b = texture2D(u_bump, v_texCoord);

後は、バンプマップや環境マップならテクスチャーと同じUV情報で処理するので
v_texCoordだけでいいのですが、全然別のUV情報が必要となると
そこはちょっとわかりませんでした。



法貴優雅

リンク

2021/4/8(Thu) 00:06:03|NO.92584

すいません、内容が趣旨と異なってましたね。スルーしてください。



youdai

リンク

2021/4/8(Thu) 09:58:15|NO.92585

スレの内容内の話題であれば、話題がそれても大丈夫です。
回り回って何か役立つことがあるかもしれません。

せっかくなのでマルチテクスチャのシェーダーを作ってみました。
作り方がわからないという人もいると思うので、発表しようと思います。

シェーダー
wtexture.vert
wtexture.frag
sample.material

テクスチャ画像
test0.png
test1.png

sampleというオブジェクトに対するシェーダーだと思ってください。

何をしているシェーダーかというとtest0.pngのテクスチャに対し、
test1.pngのテクスチャを加算しているだけです。
実用的なシェーダーではありませんが、
マルチテクスチャの仕組みのサンプルとしては十分だと思います。
test0.pngはできるだけ暗い色のテクスチャで、
test1.pngはできるだけ明るい色のテクスチャで実行してみて下さい。

wtexture.vert


//------------------------------------------------------------------------------ // attribute attribute vec4 a_position; attribute vec3 a_normal; //------------------------------------------------------------------------------ // uniform uniform mat4 u_worldViewProjectionMatrix; //------------------------------------------------------------------------------ // varying varying vec3 v_normal; //------------------------------------------------------------------------------ // main void main() { v_normal = a_normal; gl_Position = u_worldViewProjectionMatrix * a_position; }

wtexture.frag


//------------------------------------------------------------------------------ // uniform uniform sampler2D u_texture0; uniform sampler2D u_texture1; //------------------------------------------------------------------------------ // varying varying vec3 v_normal; //------------------------------------------------------------------------------ // main void main() { gl_FragColor = texture2D(u_texture0, v_normal) + texture2D(u_texture1, v_normal); }

sample.material


material wTexture { u_worldViewProjectionMatrix = WORLD_VIEW_PROJECTION_MATRIX sampler u_texture0 { mipmap = true wrapS = REPEAT wrapT = REPEAT minFilter = LINEAR_MIPMAP_LINEAR magFilter = LINEAR } sampler u_texture1 { mipmap = true wrapS = REPEAT wrapT = REPEAT minFilter = LINEAR_MIPMAP_LINEAR magFilter = LINEAR } renderState { cullFace = true depthTest = true } technique { pass { vertexShader = res/shaders/wtexture.vert fragmentShader = res/shaders/wtexture.frag } } } material mat1 : wTexture { sampler u_texture0 { path = res/test0.png } sampler u_texture1 { path = res/test1.png } }

このシェーダーはオブジェクトの法線だけで実装していますが、
実用的なレベルにするにはやはり複数のUVマップが必要になると思います。

>DRAGON CODE
さり気にミストが実装されていることに驚きました。
やるな、と思いましたね。ゲームとしても面白そうです。
ゲーム内のシェーダーについては自分のレベルではまだよく分からないところの方が圧倒的に多いのですが、
参考にさせて頂こうと思います。



ONION software Copyright 1997-2023(c) All rights reserved.