Recently I tried to add cubemaps to my 3D-rendering engine. The objects with a cubemap now turn completely black. This is how I load my cubemap:
public static int loadCubeMap(String filename)
{
int id = GL11.glGenTextures();
GL13.glActiveTexture(GL13.GL_TEXTURE0);
GL11.glBindTexture(GL13.GL_TEXTURE_CUBE_MAP, id);
for(int i = 0; i < CUBEMAP_NAMES.length; i++)
{
TextureData data = decodeTextureFile(CUBEMAPS_LOCATION + filename + "/" + CUBEMAP_NAMES[i]);
GL11.glTexImage2D(GL13.GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, GL11.GL_RGBA, data.getWidth(), data.getHeight(), 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, data.getBuffer());
}
GL11.glTexParameteri(GL13.GL_TEXTURE_CUBE_MAP, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_LINEAR);
GL11.glTexParameteri(GL13.GL_TEXTURE_CUBE_MAP, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_LINEAR);
GL11.glTexParameteri(GL13.GL_TEXTURE_CUBE_MAP, GL11.GL_TEXTURE_WRAP_S, GL12.GL_CLAMP_TO_EDGE);
GL11.glTexParameteri(GL13.GL_TEXTURE_CUBE_MAP, GL11.GL_TEXTURE_WRAP_T, GL12.GL_CLAMP_TO_EDGE);
return id;
}
TextureData class only contains: int width, height and a ByteBuffer buffer
private static TextureData decodeTextureFile(String fileName)
{
int width = 0;
int height = 0;
ByteBuffer buffer = null;
try
{
FileInputStream in = new FileInputStream(TEXTURES_LOCATION + fileName + ".png");
PNGDecoder decoder = new PNGDecoder(in);
width = decoder.getWidth();
height = decoder.getHeight();
buffer = ByteBuffer.allocateDirect(4 * width * height);
decoder.decode(buffer, width * 4, Format.RGBA);
buffer.flip();
in.close();
} catch (Exception e)
{
e.printStackTrace();
}
return new TextureData(width, height, buffer);
}
This is how I load the cubemap to the samplerCube cubemap[i] in the fragment shader:
public void loadCubeMap(int id, CubeMap cubemap, int cubemapid)
{
if(cubemap != null)
{
super.loadTexture(location_cubemaps[cubemapid], cubemap.id, id, GL13.GL_TEXTURE_CUBE_MAP);
super.loadFloat(location_cubemap_intensity[id], cubemap.intensity);
}else
{
super.loadFloat(location_cubemap_intensity[id], 0.0f);
}
}
in super class:
protected void loadTexture(int location, int texture, int i, int texturetype)
{
loadInt(location, i+1);
GL13.glActiveTexture(GL13.GL_TEXTURE0 + i);
GL11.glBindTexture(texturetype, texture);
}
And this is my fragment shader:
#version 400 core
in vec4 color;
in vec2 texCoord0;
in vec3 surface_normal;
in vec3 to_light_vector;
in vec3 world_position_out;
out vec4 out_Color;
uniform sampler2D sampler0;
uniform samplerCube cubemap[3];
uniform vec3 lightColor;
uniform float cubemap_intensity[3];
uniform int hasTexture;
void main(void)
{
vec3 unitNormal = normalize(surface_normal);
vec3 unitLight = normalize(to_light_vector);
float nDot1 = dot(unitNormal, unitLight);
float brightness = max(nDot1, 0.02);
vec3 diffuse = color.xyz * brightness * lightColor * color.xyz;
vec4 textureColor = texture(sampler0, texCoord0.xy);
if(textureColor.a < 0.5)
discard;
vec4 shadedTextureColor = brightness * vec4(lightColor, 1) * textureColor;
vec4 coloredShadedTexture = mix(vec4(diffuse, 1), shadedTextureColor, textureColor.a * hasTexture);
vec4 reflectionColor = texture(cubemap[0], world_position_out);
vec4 refractionColor;
vec4 cubemapColor;
out_Color = reflectionColor;
}
GL_TEXTURE_WRAP_R
but i doubt this is the problem. \$\endgroup\$