ディフューズ カラーだけで球体を描画しようとしていますが、何も表示されません。「カラー」シェーダーを「テクスチャ」シェーダーと交換すると、すべてがうまく表示されるため、すべての OpenGL コードは正しいはずです。
これはシェーダー選択コードです。if-branch はテクスチャ オブジェクト用で、else-branch はカラーのみのオブジェクト用です。
GL.Disable(EnableCap.Blend);
if (phong.diffuseTexture != 0)
{
texturedShader.Enable();
GL.UniformMatrix4(texturedShader.GetUniformLocation("view"), false, ref camView);
GL.UniformMatrix4(texturedShader.GetUniformLocation("projection"), false, ref Camera.main.projection);
GL.ActiveTexture(TextureUnit.Texture0);
GL.BindTexture(TextureTarget.Texture2D, phong.diffuseTexture);
int colorMapLoc = Shader.currentShader.GetUniformLocation("colorMap");
if (colorMapLoc > -1) GL.Uniform1(colorMapLoc, 0);
}
else
{
coloredShader.Enable();
GL.UniformMatrix4(texturedShader.GetUniformLocation("view"), false, ref camView);
GL.UniformMatrix4(texturedShader.GetUniformLocation("projection"), false, ref Camera.main.projection);
}
// Continues with the VBO rendering code...
したがって、最初のブランチは機能しますが、2 番目のブランチは何も出力しません。カラーのみのシェーダーは次のとおりです (そのほとんどは、テクスチャ シェーダーからコピーして貼り付けただけです。そのため、texcoords などが残っています)。
// VERTEX SHADER
#version 330
uniform mat4 projection;
uniform mat4 view;
uniform mat4 world;
uniform vec3 diffuseColor;
layout(location = 0) in vec3 in_position;
layout(location = 1) in vec3 in_normal;
layout(location = 2) in vec2 in_texcoord;
layout(location = 3) in vec3 in_tangent;
layout(location = 4) in vec3 in_binormal;
out mat3 tangentToWorld;
out vec2 texcoord;
out vec3 normal;
out vec3 color;
void main(void)
{
gl_Position = projection * view * world * vec4(in_position, 1.0);
color = diffuseColor;
normal = (world * vec4(normalize(in_normal), 0.0)).xyz;
tangentToWorld[0] = (world * vec4(in_tangent, 0.0)).xyz;
tangentToWorld[1] = (world * vec4(in_binormal, 0.0)).xyz;
tangentToWorld[2] = (world * vec4(in_normal, 0.0)).xyz;
texcoord = in_texcoord;
}
// FRAGMENT SHADER
#version 330
in vec2 texcoord;
in mat3 tangentToWorld;
in vec3 normal;
in vec3 color;
layout(location = 0) out vec4 out_diffuse;
layout(location = 1) out vec4 out_normal;
void main(void)
{
out_diffuse = vec3(1, 0, 1, 1);
vec3 normal = vec3(0.5, 0.5, 1.0);
normal = 2.0 * normal - 1.0;
normal = tangentToWorld * normal;
normal = (normal + 1.0) / 2;
normal = normalize(normal);
out_normal = vec4(normal.x, normal.y, normal.z, 1.0);
}
... そして、これがテクスチャ シェーダーです。
// VERTEX SHADER
#version 330
uniform mat4 projection;
uniform mat4 view;
uniform mat4 world;
layout(location = 0) in vec3 in_position;
layout(location = 1) in vec3 in_normal;
layout(location = 2) in vec2 in_texcoord;
layout(location = 3) in vec3 in_tangent;
layout(location = 4) in vec3 in_binormal;
out mat3 tangentToWorld;
out vec2 texcoord;
out vec3 normal;
void main(void)
{
gl_Position = projection * view * world * vec4(in_position, 1.0);
normal = (world * vec4(normalize(in_normal), 0.0)).xyz;
tangentToWorld[0] = (world * vec4(in_tangent, 0.0)).xyz;
tangentToWorld[1] = (world * vec4(in_binormal, 0.0)).xyz;
tangentToWorld[2] = (world * vec4(in_normal, 0.0)).xyz;
texcoord = in_texcoord;
}
// FRAGMENT SHADER
#version 330
in vec2 texcoord;
in mat3 tangentToWorld;
in vec3 normal;
layout(location = 0) out vec3 out_diffuse;
layout(location = 1) out vec4 out_normal;
uniform sampler2D colorMap;
uniform sampler2D normalMap;
void main(void)
{
out_diffuse = texture(colorMap, texcoord).xyz;
vec3 normal = texture(normalMap, texcoord).xyz;
normal = 2.0 * normal - 1.0;
normal = tangentToWorld * normal;
normal = (normal + 1.0) / 2;
normal = normalize(normal);
out_normal = vec4(normal.x, normal.y, normal.z, texture(normalMap, texcoord).a);
}
そのために、すべてをテクスチャ シェーダーでレンダリングすると、次のようになります。
...そして、これは両方のシェーダーを使用したときに得られるものです:
これを引き起こしている可能性のあるアイデアはありますか?シェーダーはエラーなしでコンパイルされ、すべてがテクスチャ シェーダーで動作します。何も出力しないのはカラー シェーダーだけです。