PDA

View Full Version : Cubemap skybox



Rifiul
02-13-2014, 12:57 PM
I have been following the OpenGL Superbible 6th Edition and I've come across a wall. I'm using almost identical code to what's supplied in the samples, except where necessary I have rolled my own.
I am getting desperate, I can't seem to get this to work AT ALL, all I see on the screen is black. My custom functions do work, and have worked for other applications so they can't be the problem.
If any more information is required please let me know.

Here is my code:

glGenTextures(1, &m_TextureID);
glActiveTexture(GL_TEXTURE0);
glEnable(GL_TEXTURE_CUBE_MAP_SEAMLESS);


glBindTexture(GL_TEXTURE_CUBE_MAP, m_TextureID);

unsigned char* pixelData1[6];
int width = 0; int height = 0; int channels = 0;
pixelData1[0] = SOIL_load_image(m_TextureFiles[0], &width, &height, &channels, SOIL_LOAD_AUTO);
glTexStorage2D(GL_TEXTURE_CUBE_MAP, 0, GL_RGB, width, height);


for ( int i = 0; i < 6; ++i)
{
printf("Width: %i Height: %i Channels: %i\n", width, height, channels); // data + face * face_size_in_bytes
glTexSubImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X+i,0 ,0,0,2048,1536,GL_RGB,GL_UNSIGNED_BYTE, pixelData1[0] + ((3*width)*height) * i );

}

glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_LINEAR);


//object.load("media/objects/dragon.sbm");

//// load shaders and link shader program
m_vertShader = Utility::loadShader("../../Build/Shaders/skybox.vert", GL_VERTEX_SHADER);
m_fragShader = Utility::loadShader("../../Build/Shaders/skybox.frag", GL_FRAGMENT_SHADER);

// our vertex buffer has 3 properties per-vertex
const char* inputs[] = { "view_matrix" };
m_skyboxShader = Utility::createProgram(m_vertShader,0,0,0,m_fragSh ader, 0, 0);

m_vertShader = Utility::loadShader("../../Build/Shaders/render.vert", GL_VERTEX_SHADER);
m_fragShader = Utility::loadShader("../../Build/Shaders/render.frag", GL_FRAGMENT_SHADER);

// our vertex buffer has 3 properties per-vertex
const char* inputs1[] = { "position", "normal" };
m_renderShader = Utility::createProgram(m_vertShader,0,0,0,m_fragSh ader, 2, inputs1);

glGenVertexArrays(1, &m_vao);
//glBindVertexArray(m_vao);

glDepthFunc(GL_LEQUAL);

And my draw call:


glDisable( GL_CULL_FACE );

glBindTexture(GL_TEXTURE_CUBE_MAP, m_TextureID);


glUseProgram(m_skyboxShader);
glBindVertexArray(m_vao);

GLint uView = glGetUniformLocation(m_skyboxShader, "view_matrix");
glUniformMatrix4fv(uView, 1, GL_FALSE, glm::value_ptr(view));


glDisable(GL_DEPTH_TEST);

glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

glBindVertexArray(0);
glUseProgram(0);


glEnable(GL_DEPTH_TEST);

Shaders:



// Vert...

#version 410 core

uniform mat4 mv_matrix;
uniform mat4 proj_matrix;

layout (location = 0) in vec4 position;
layout (location = 1) in vec3 normal;

out VS_OUT
{
vec3 normal;
vec3 view;
} vs_out;

void main(void)
{
vec4 pos_vs = mv_matrix * position;

vs_out.normal = mat3(mv_matrix) * normal;
vs_out.view = pos_vs.xyz;

gl_Position = proj_matrix * pos_vs;
}

// Fragment....

#version 410 core

uniform samplerCube tex_cubemap;

in VS_OUT
{
vec3 tc;
} fs_in;

layout (location = 0) out vec4 color;

void main(void)
{
color = texture(tex_cubemap, fs_in.tc);
}