void Ex06_16::InitGL() { if (! LoadGL() ) return; ShaderInfo base_shaders[] = { { GL_VERTEX_SHADER, "Shaders/sh06_16.vert" }, { GL_FRAGMENT_SHADER, "Shaders/sh06_16.frag" }, { GL_NONE, NULL } }; base_prog = LoadShaders( base_shaders ); glGenBuffers(1, &quad_vbo); glBindBuffer(GL_ARRAY_BUFFER, quad_vbo); static const GLfloat quad_data[] = { 1.0f, -1.0f, -1.0f, -1.0f, -1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f }; glBufferData(GL_ARRAY_BUFFER, sizeof(quad_data), quad_data, GL_STATIC_DRAW); glGenVertexArrays(1, &vao); glBindVertexArray(vao); glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(0)); glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(8 * sizeof(float))); glEnableVertexAttribArray(0); glEnableVertexAttribArray(1); glLinkProgram(base_prog); char buf[1024]; glGetProgramInfoLog(base_prog, 1024, NULL, buf); tc_rotate_loc = glGetUniformLocation(base_prog, "tc_rotate"); vglImageData image; tex = vglLoadTexture("Media/cloud.dds", 0, &image); glTexParameteri(image.target, GL_TEXTURE_MIN_FILTER, GL_LINEAR); vglUnloadImage(&image); }
void Ex06_14::InitGL() { if (! LoadGL() ) return; ShaderInfo base_shaders[] = { { GL_VERTEX_SHADER, "Shaders/sh06_14.vert" }, { GL_FRAGMENT_SHADER, "Shaders/sh06_14.frag" }, { GL_NONE, NULL } }; base_prog = LoadShaders( base_shaders ); glGenBuffers(1, &quad_vbo); glBindBuffer(GL_ARRAY_BUFFER, quad_vbo); static const GLfloat quad_data[] = { 1.0f, -1.0f, -1.0f, -1.0f, -1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f }; glBufferData(GL_ARRAY_BUFFER, sizeof(quad_data), quad_data, GL_STATIC_DRAW); glGenVertexArrays(1, &vao); glBindVertexArray(vao); glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(0)); glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(8 * sizeof(float))); glEnableVertexAttribArray(0); glEnableVertexAttribArray(1); glLinkProgram(base_prog); char buf[1024]; glGetProgramInfoLog(base_prog, 1024, NULL, buf); // prog is the name of a linked program containing our example // vertex and fragment shaders glUseProgram(base_prog); // For the first texture, we will use texture unit 0... // Get the uniform location GLint tex1_uniform_loc = glGetUniformLocation(base_prog, "tex1"); // Set it to 0 glUniform1i(tex1_uniform_loc, 0); // Select texture unit 0 glActiveTexture(GL_TEXTURE0); // Bind a texture to it glBindTexture(GL_TEXTURE_2D, tex1); // Repeat the above process for texture unit 1 GLint tex2_uniform_loc = glGetUniformLocation(base_prog, "tex2"); glUniform1i(tex2_uniform_loc, 1); glActiveTexture(GL_TEXTURE1); glBindTexture(GL_TEXTURE_2D, tex2); time_loc = glGetUniformLocation(base_prog, "time"); vglImageData image; tex1 = vglLoadTexture("Media/test.dds", 0, &image); glTexParameteri(image.target, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); vglUnloadImage(&image); tex2 = vglLoadTexture("Media/test3.dds", 0, &image); vglUnloadImage(&image); }
GLuint vglLoadTexture(const char* filename, GLuint texture, vglImageData* image) { vglImageData local_image; int level; if (image == 0) image = &local_image; vglLoadImage(filename, image); if (texture == 0) { glGenTextures(1, &texture); } glBindTexture(image->target, texture); GLubyte * ptr = (GLubyte *)image->mip[0].data; switch (image->target) { case GL_TEXTURE_1D: glTexStorage1D(image->target, image->mipLevels, image->internalFormat, image->mip[0].width); for (level = 0; level < image->mipLevels; ++level) { glTexSubImage1D(GL_TEXTURE_1D, level, 0, image->mip[level].width, image->format, image->type, image->mip[level].data); } break; case GL_TEXTURE_1D_ARRAY: glTexStorage2D(image->target, image->mipLevels, image->internalFormat, image->mip[0].width, image->slices); for (level = 0; level < image->mipLevels; ++level) { glTexSubImage2D(GL_TEXTURE_1D, level, 0, 0, image->mip[level].width, image->slices, image->format, image->type, image->mip[level].data); } break; case GL_TEXTURE_2D: glTexStorage2D(image->target, image->mipLevels, image->internalFormat, image->mip[0].width, image->mip[0].height); for (level = 0; level < image->mipLevels; ++level) { glTexSubImage2D(GL_TEXTURE_2D, level, 0, 0, image->mip[level].width, image->mip[level].height, image->format, image->type, image->mip[level].data); } break; case GL_TEXTURE_CUBE_MAP: for (level = 0; level < image->mipLevels; ++level) { ptr = (GLubyte *)image->mip[level].data; for (int face = 0; face < 6; face++) { glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + face, level, image->internalFormat, image->mip[level].width, image->mip[level].height, 0, image->format, image->type, ptr + image->sliceStride * face); } } break; case GL_TEXTURE_2D_ARRAY: glTexStorage3D(image->target, image->mipLevels, image->internalFormat, image->mip[0].width, image->mip[0].height, image->slices); for (level = 0; level < image->mipLevels; ++level) { glTexSubImage3D(GL_TEXTURE_2D_ARRAY, level, 0, 0, 0, image->mip[level].width, image->mip[level].height, image->slices, image->format, image->type, image->mip[level].data); } break; case GL_TEXTURE_CUBE_MAP_ARRAY: glTexStorage3D(image->target, image->mipLevels, image->internalFormat, image->mip[0].width, image->mip[0].height, image->slices); break; case GL_TEXTURE_3D: glTexStorage3D(image->target, image->mipLevels, image->internalFormat, image->mip[0].width, image->mip[0].height, image->mip[0].depth); for (level = 0; level < image->mipLevels; ++level) { glTexSubImage3D(GL_TEXTURE_3D, level, 0, 0, 0, image->mip[level].width, image->mip[level].height, image->mip[level].depth, image->format, image->type, image->mip[level].data); } break; default: break; } glTexParameteriv(image->target, GL_TEXTURE_SWIZZLE_RGBA, reinterpret_cast<const GLint *>(image->swizzle)); if (image == &local_image) { vglUnloadImage(image); } return texture; }
void MultiTextureExample::Initialize(const char * title) { base::Initialize(title); base_prog = glCreateProgram(); static const char quad_shader_vs[] = "#version 330 core\n" "\n" "layout (location = 0) in vec2 in_position;\n" "layout (location = 1) in vec2 in_tex_coord;\n" "\n" "out vec2 tex_coord0;\n" "out vec2 tex_coord1;\n" "\n" "uniform float time;\n" "\n" "void main(void)\n" "{\n" " mat2 m = mat2( vec2(cos(time), sin(time)),\n" " vec2(-sin(time), cos(time)) );\n" " gl_Position = vec4(in_position, 0.5, 1.0);\n" " tex_coord0 = in_tex_coord * m;\n" " tex_coord1 = in_tex_coord * transpose(m);\n" "}\n" ; static const char quad_shader_fs[] = "#version 330 core\n" "\n" "in vec2 tex_coord0;\n" "in vec2 tex_coord1;\n" "\n" "layout (location = 0) out vec4 color;\n" "\n" "uniform sampler2D tex1;\n" "uniform sampler2D tex2;\n" "\n" "void main(void)\n" "{\n" " color = texture(tex1, tex_coord0) + texture(tex2, tex_coord1);\n" "}\n" ; vglAttachShaderSource(base_prog, GL_VERTEX_SHADER, quad_shader_vs); vglAttachShaderSource(base_prog, GL_FRAGMENT_SHADER, quad_shader_fs); glGenBuffers(1, &quad_vbo); glBindBuffer(GL_ARRAY_BUFFER, quad_vbo); static const GLfloat quad_data[] = { 1.0f, -1.0f, -1.0f, -1.0f, -1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f }; glBufferData(GL_ARRAY_BUFFER, sizeof(quad_data), quad_data, GL_STATIC_DRAW); glGenVertexArrays(1, &vao); glBindVertexArray(vao); glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(0)); glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(8 * sizeof(float))); glEnableVertexAttribArray(0); glEnableVertexAttribArray(1); glLinkProgram(base_prog); char buf[1024]; glGetProgramInfoLog(base_prog, 1024, NULL, buf); glUseProgram(base_prog); time_loc = glGetUniformLocation(base_prog, "time"); glUniform1i(glGetUniformLocation(base_prog, "tex1"), 0); glUniform1i(glGetUniformLocation(base_prog, "tex2"), 1); vglImageData image; tex1 = vglLoadTexture("media/test.dds", 0, &image); glBindTexture(image.target, tex1); glTexParameteri(image.target, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); vglUnloadImage(&image); tex2 = vglLoadTexture("media/test3.dds", 0, &image); vglUnloadImage(&image); }
void LoadTextureExample::Initialize(const char * title) { base::Initialize(title); base_prog = glCreateProgram(); static const char quad_shader_vs[] = "#version 330 core\n" "\n" "layout (location = 0) in vec2 in_position;\n" "layout (location = 1) in vec2 in_tex_coord;\n" "\n" "out vec2 tex_coord;\n" "\n" "void main(void)\n" "{\n" " gl_Position = vec4(in_position, 0.5, 1.0);\n" " tex_coord = in_tex_coord;\n" "}\n" ; static const char quad_shader_fs[] = "#version 330 core\n" "\n" "in vec2 tex_coord;\n" "\n" "layout (location = 0) out vec4 color;\n" "\n" "uniform sampler2D tex;\n" "\n" "void main(void)\n" "{\n" " color = texture(tex, tex_coord);\n" "}\n" ; vglAttachShaderSource(base_prog, GL_VERTEX_SHADER, quad_shader_vs); vglAttachShaderSource(base_prog, GL_FRAGMENT_SHADER, quad_shader_fs); glGenBuffers(1, &quad_vbo); glBindBuffer(GL_ARRAY_BUFFER, quad_vbo); static const GLfloat quad_data[] = { 1.0f, -1.0f, -1.0f, -1.0f, -1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f }; glBufferData(GL_ARRAY_BUFFER, sizeof(quad_data), quad_data, GL_STATIC_DRAW); glGenVertexArrays(1, &vao); glBindVertexArray(vao); glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(0)); glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(8 * sizeof(float))); glEnableVertexAttribArray(0); glEnableVertexAttribArray(1); glLinkProgram(base_prog); char buf[1024]; glGetProgramInfoLog(base_prog, 1024, NULL, buf); vglImageData image; tex = vglLoadTexture("d:/svn/Vermilion-Book/trunk/Code/media/test.dds", 0, &image); glTexParameteri(image.target, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); vglUnloadImage(&image); }
void CubeMapExample::Initialize(const char * title) { base::Initialize(title); skybox_prog = glCreateProgram(); static const char skybox_shader_vs[] = "#version 330 core\n" "\n" "layout (location = 0) in vec3 in_position;\n" "\n" "out vec3 tex_coord;\n" "\n" "uniform mat4 tc_rotate;\n" "\n" "void main(void)\n" "{\n" " gl_Position = tc_rotate * vec4(in_position, 1.0);\n" " tex_coord = in_position;\n" "}\n" ; static const char skybox_shader_fs[] = "#version 330 core\n" "\n" "in vec3 tex_coord;\n" "\n" "layout (location = 0) out vec4 color;\n" "\n" "uniform samplerCube tex;\n" "\n" "void main(void)\n" "{\n" " color = texture(tex, tex_coord);\n" "}\n" ; vglAttachShaderSource(skybox_prog, GL_VERTEX_SHADER, skybox_shader_vs); vglAttachShaderSource(skybox_prog, GL_FRAGMENT_SHADER, skybox_shader_fs); glLinkProgram(skybox_prog); static const char object_shader_vs[] = "#version 330 core\n" "\n" "layout (location = 0) in vec4 in_position;\n" "layout (location = 1) in vec3 in_normal;\n" "\n" "out vec3 vs_fs_normal;\n" "out vec3 vs_fs_position;\n" "\n" "uniform mat4 mat_mvp;\n" "uniform mat4 mat_mv;\n" "\n" "void main(void)\n" "{\n" " gl_Position = mat_mvp * in_position;\n" " vs_fs_normal = mat3(mat_mv) * in_normal;\n" " vs_fs_position = (mat_mv * in_position).xyz;\n" "}\n" ; static const char object_shader_fs[] = "#version 330 core\n" "\n" "in vec3 vs_fs_normal;\n" "in vec3 vs_fs_position;\n" "\n" "layout (location = 0) out vec4 color;\n" "\n" "uniform samplerCube tex;\n" "\n" "void main(void)\n" "{\n" " vec3 tc = reflect(vs_fs_position, normalize(vs_fs_normal));\n" " color = vec4(0.3, 0.2, 0.1, 1.0) + vec4(0.97, 0.83, 0.79, 0.0) * texture(tex, tc);\n" "}\n" ; object_prog = glCreateProgram(); vglAttachShaderSource(object_prog, GL_VERTEX_SHADER, object_shader_vs); vglAttachShaderSource(object_prog, GL_FRAGMENT_SHADER, object_shader_fs); glLinkProgram(object_prog); glGenBuffers(1, &cube_vbo); glBindBuffer(GL_ARRAY_BUFFER, cube_vbo); static const GLfloat cube_vertices[] = { -1.0f, -1.0f, -1.0f, -1.0f, -1.0f, 1.0f, -1.0f, 1.0f, -1.0f, -1.0f, 1.0f, 1.0f, 1.0f, -1.0f, -1.0f, 1.0f, -1.0f, 1.0f, 1.0f, 1.0f, -1.0f, 1.0f, 1.0f, 1.0f }; static const GLushort cube_indices[] = { 0, 1, 2, 3, 6, 7, 4, 5, // First strip 2, 6, 0, 4, 1, 5, 3, 7 // Second strip }; glBufferData(GL_ARRAY_BUFFER, sizeof(cube_vertices), cube_vertices, GL_STATIC_DRAW); glGenVertexArrays(1, &vao); glBindVertexArray(vao); glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(0)); glEnableVertexAttribArray(0); glGenBuffers(1, &cube_element_buffer); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, cube_element_buffer); glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(cube_indices), cube_indices, GL_STATIC_DRAW); skybox_rotate_loc = glGetUniformLocation(skybox_prog, "tc_rotate"); object_mat_mvp_loc = glGetUniformLocation(object_prog, "mat_mvp"); object_mat_mv_loc = glGetUniformLocation(object_prog, "mat_mv"); vglImageData image; tex = vglLoadTexture("../../media/TantolundenCube.dds", 0, &image); GLenum e; e = glGetError(); vglUnloadImage(&image); object.LoadFromVBM("../../media/unit_torus.vbm", 0, 1, 2); }