質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
OpenGL

OpenGLは、プラットフォームから独立した、デスクトップやワークステーション、モバイルサービスで使用可能な映像処理用のAPIです。

3DCG

コンピュータの演算により、3次元空間の仮想物体を、2次元平面上で表現する手法である。

GLSL

GLSL (OpenGL Shading Language) はC言語をベースとしたシェーディング言語です。

Q&A

解決済

1回答

1461閲覧

Opengl シルバーのマテリアル感を出す方法が知りたい。

退会済みユーザー

退会済みユーザー

総合スコア0

OpenGL

OpenGLは、プラットフォームから独立した、デスクトップやワークステーション、モバイルサービスで使用可能な映像処理用のAPIです。

3DCG

コンピュータの演算により、3次元空間の仮想物体を、2次元平面上で表現する手法である。

GLSL

GLSL (OpenGL Shading Language) はC言語をベースとしたシェーディング言語です。

0グッド

1クリップ

投稿2021/11/01 08:51

編集2021/11/01 09:13

提示コードのMain.cppコード部ですがマテリアルのライティングでマテリアル感を出すにはどういったマテリアルを指定すればいいのでしょうか?参考サイトを参考にマテリアルを実装したいのですがいまいち体感がありません。どうすればマテリアル感を出せるのでしょうか?参考サイトを参考にマテリアルを設定しましたが今一再現できません。

知りたいこと

マテリアル感を出すにはどういった値を設定すればいいのか?
マテリアルとは質感という言い方をしますが色なのでしょうか?

イメージ説明

参考サイト: https://learnopengl.com/Lighting/Materials
参考サイト: http://devernay.free.fr/cours/opengl/materials.html

Main.cpp
// LightCube lightCube.shader->setEnable(); lightCube.setPosition(lightPos); lightCube.setScale(glm::vec3(10, 10, 10)); lightCube.shader->setUniform4f("uFragment",FrameWork::GetGlColor(glm::vec4(255,255,255,255))); lightCube.Renderer(); lightCube.shader->setDisable(); // Cube cube.shader->setEnable(); cube.setPosition(cubePos); cube.setScale(glm::vec3(25, 25, 25)); glm::vec3 lightColor; lightColor.x = 1.0f; lightColor.y = 1.0f; lightColor.z = 1.0f; glm::vec3 diffuseColor = lightColor; // decrease the influence glm::vec3 ambientColor = diffuseColor; // low influence cube.shader->setUniform3f("light.ambient", ambientColor); cube.shader->setUniform3f("light.diffuse", diffuseColor); cube.shader->setUniform3f("light.specular", glm::vec3(1.0f, 1.0f, 1.0f)); // material properties cube.shader->setUniform3f("material.ambient",glm::vec3( 0.19225, 0.19225, 0.19225)); cube.shader->setUniform3f("material.diffuse", glm::vec3(0.50754, 0.50754, 0.50754)); cube.shader->setUniform3f("material.specular", glm::vec3(0.508273, 0.508273, 0.508273)); // specular lighting doesn't have full effect on this object's material cube.shader->setUniform1f("material.shininess", 128.0f * 0.4f); cube.shader->setUniform3f("uViewPosition", FrameWork::Camera::getPosition());
VertexShader
/*######################################################################### # ###########################################################################*/ #version 420 //#extension GL_ARB_explicit_uniform_location : require layout(location = 0) in vec3 vertexPosition; layout(location = 1) in vec3 vertexNormal; uniform mat4 uTranslate; uniform mat4 uRotate; uniform mat4 uScale; uniform mat4 uViewProjection; layout(location = 2) out vec3 vPosition; layout(location = 3) out vec3 vNormal; void main() { vec4 vertex = vec4(vertexPosition,1.0); mat4 model = uTranslate * uRotate * uScale; gl_Position = (uViewProjection * model) * vertex; vPosition = vec3(model * vec4(vertexPosition,1.0)); vNormal = mat3(transpose(inverse(model))) * vertexNormal; }
Fragment Shader
/*######################################################################### # ###########################################################################*/ #version 420 //#extension GL_ARB_explicit_uniform_location : require layout(location = 2) in vec3 vPosition; layout(location = 3) in vec3 vNormal; //マテリアル struct Material { vec3 ambient; vec3 diffuse; vec3 specular; float shininess; // uniform float uAmbientStrength; //環境光の強さ // uniform float uSpecularStrength; //鏡面反射の強さ // uniform float uBrightStrength; //反射輝度の強さ }; //ライト struct Light { vec3 position; vec3 ambient; vec3 diffuse; vec3 specular; }; uniform Material material; //マテリアル uniform Light light; //ライト uniform vec3 uViewPosition; //カメラ座標 out vec4 fragment; void main() { // ambient // float ambientStrength = 0.1; vec3 ambient = material.ambient * light.ambient; // diffuse vec3 norm = normalize(vNormal); vec3 lightDir = normalize(light.position - vPosition); float diff = max(dot(norm, lightDir), 0.0); vec3 diffuse = light.diffuse * (diff * material.diffuse); // specular //float specularStrength = 0.5; vec3 viewDir = normalize(uViewPosition - vPosition); vec3 reflectDir = reflect(-lightDir, norm); float spec = pow(max(dot(viewDir, reflectDir), 0.0), material.shininess); vec3 specular = light.specular * (spec * material.specular); vec3 result = ambient + diffuse + specular; fragment = vec4(result, 1.0); }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fana

2021/11/01 09:10

> マテリアル感 もはや感覚の範疇だと思われるので, 様々な値を試してみて,あなたの感性で「いい感じ」の値を決めればよいのではないでしょうか.
退会済みユーザー

退会済みユーザー

2021/11/01 09:11

鉄、とかそういったわかりやすい物を再現したいのですが提示サイトのようにマテリアルを設定しましたがそれらしい感じがまったくありません。
fana

2021/11/01 09:20

あなたの提示している絵は,どうにもライティング計算の恩恵が得られていない感があるよね. まずは「 diffuse や specular の効果が十分わかる状態で試す」形を用意するのが先じゃない? で,金属的な雰囲気を目指すなら,鏡面反射が鋭い感じとかにしてみたらいいんじゃない?
退会済みユーザー

退会済みユーザー

2021/11/01 09:32

なるほど。質問ですがマテリアルって色ですか。?
guest

回答1

0

ベストアンサー

これまであなたが提示してきたシェーダコード等を,私なりに参考にして(「切り張りして」とも言う) Phong シェーディングの実装を用意し,
物体のマテリアルのうち shininess だけを3パターンに変えてみた結果を示します.
(物体の配置位置や姿勢は完全に同一なわけではありませんが,shininess の効果の差を見る分には問題ないでしょう.)

イメージ説明

で,例えば「この3つではどれがより金属っぽいのか?」といわれたら……それは多分に主観の問題だと思います.

試す前には,鏡面反射をとにかく鋭くした方が金属っぽいかな?とか思いましたが,
最もそのようにした一番右は私にはあまり金属っぽく感じませんでした.左や真ん中がまだ金属っぽく感じる気もします.

試しに,一番右側の diffuse を1.5倍にしてみたところ,私には金属というよりも陶器みたい感じました.
(スクショだといまいち雰囲気がわからないけども)

イメージ説明


と,まぁ,何が言いたいかと言うと,
こんな感じで,自分の感覚で色々な値を試してみて調整するしかないんじゃない? ということです.

どこぞから値を拾ってきたとしても,その値の使い方が違うかもしれない(何をどう使うかはシェーダの実装次第ですよね)のですから,あくまでも参考程度にしかならないのではないでしょうか.

投稿2021/11/01 10:34

編集2021/11/01 10:36
fana

総合スコア11658

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fana

2021/11/01 10:40

(何なら,キーを押す毎にマテリアルが変わるような物でも作ってみたらいいんじゃないかな?)
fana

2021/11/01 10:44 編集

とりあえず提示した絵はどれも シルバー な感じはしないよね. 難しいなぁ. R,G よりも B をちょっとだけ大きくしてみたんだけど,それがかえってダメなのかな?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問