Ich entwerfe eine Sprite-Klasse, und ich möchte nur eine Farbe anzeigen, wenn keine Textur geladen ist.Überprüfen Sie, ob Sampler2D leer ist
Hier sind mein Vertex-Shader
#version 330 core
layout (location = 0) in vec4 vertex; // <vec2 pos, vec2 tex>
out vec2 vs_tex_coords;
uniform mat4 model;
uniform mat4 projection;
void main()
{
vs_tex_coords = vertex.zw;
gl_Position = projection * model * vec4(vertex.xy, 0.0, 1.0);
}
Und die Fragment-Shader:
#version 330 core
in vec2 vs_tex_coords;
out vec4 fs_color;
uniform sampler2D image;
uniform vec3 sprite_color;
void main()
{
fs_color = vec4(sprite_color, 1.0) * texture(image, vs_tex_coords);
}
Mein Problem ist, dass, wenn ich nicht eine Textur binden, zeigt es nur einen schwarzen Sprit. Ich denke, das Problem ist, dass die Textur-Funktion in meinem Fragment-Shader eine 0 zurückgibt und die ganze Formel verschraubt.
Gibt es eine Möglichkeit zu wissen, ob der sampler2D nicht initialisiert oder null ist, und nur die sprite_color zurückgeben?
LÖSUNG:
Die Lösung war eine leere 1x1 Textur zu erzeugen, und es trotzdem zu binden. Dazu müssen Sie ein Array von 4 Zeichen bis 255 (für RGBA) erstellen und der Funktion glTexImage2D
die Größe von 1x1 zuweisen, um sicherzustellen, dass eine 1x1-Textur erstellt wird.
Texture::Texture()
{
glGenTextures(1, &ID);
GLubyte data[] = { 255, 255, 255, 255 };
glBindTexture(GL_TEXTURE_2D, ID);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, wrap_s);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, wrap_t);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, min_filter);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, mag_filter);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, data);
size.x = 1;
size.y = 1;
}
Binden Sie eine 1x1 Textur mit der gewünschten Farbe? – genpfault