提示コードの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); }
回答1件
あなたの回答
tips
プレビュー