TextureDescription RenderingEngine::SetPngTexture(const string& filename) { //return _resourceManager->LoadPngImage2(filename); TextureDescription description = _resourceManager->LoadPngImage(filename); GLuint name; glGenTextures(1, &name); description.Name = name; glBindTexture(GL_TEXTURE_2D, name); //_currentTextureID = name; glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); GLenum format = 0; switch (description.Format) { case TextureFormatGray: format = GL_LUMINANCE; break; case TextureFormatGrayAlpha: format = GL_LUMINANCE_ALPHA; break; case TextureFormatRgb: format = GL_RGB; break; case TextureFormatRgba: format = GL_RGBA; break; default: break; } GLenum type; switch (description.BitsPerComponent) { case 8: type = GL_UNSIGNED_BYTE; break; case 4: if (GL_RGBA == format) { type = GL_UNSIGNED_SHORT_4_4_4_4; break; } // intentionally fall through default: assert(!"Unsupported format."); } void* data = _resourceManager->GetImageData(); ivec2 size = description.Size; glTexImage2D(GL_TEXTURE_2D, 0, format, size.x, size.y, 0, format, type, data); _resourceManager->UnloadImage(); return description; // TextureDescription description = _resourceManager->LoadPngImage2(filename); // // return description; }
void RenderingEngine::UploadImage(const TextureDescription& description, void* data) { GLenum format; switch (description.Format) { case TextureFormatRgb: format = GL_RGB; break; case TextureFormatRgba: format = GL_RGBA; break; } GLenum type = GL_UNSIGNED_BYTE; ivec2 size = description.Size; if (data == 0) { data = m_resourceManager->GetImageData(); glTexImage2D(GL_TEXTURE_2D, 0, format, size.x, size.y, 0, format, type, data); m_resourceManager->UnloadImage(); } else { glTexImage2D(GL_TEXTURE_2D, 0, format, size.x, size.y, 0, format, type, data); } }
TextureDescription RenderingEngine::SetPvrTexture(const string& filename) { TextureDescription description = _resourceManager->LoadPvrImage(filename); GLuint name; glGenTextures(1, &name); description.Name = name; glBindTexture(GL_TEXTURE_2D, name); //_currentTextureID = name; glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); unsigned char* data = (unsigned char*) _resourceManager->GetImageData(); int width = description.Size.x; int height = description.Size.y; int bitsPerPixel = 0; GLenum format; bool compressed = true; switch (description.Format) { case TextureFormatPvrtcRgba2: bitsPerPixel = 2; format = GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG; break; case TextureFormatPvrtcRgb2: bitsPerPixel = 2; format = GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG; break; case TextureFormatPvrtcRgba4: bitsPerPixel = 4; format = GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG; break; case TextureFormatPvrtcRgb4: bitsPerPixel = 4; format = GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG; break; default: compressed = false; break; } if (compressed) { for (int level = 0; level < description.MipCount; ++level) { GLsizei size = max(32, width * height * bitsPerPixel / 8); glCompressedTexImage2D(GL_TEXTURE_2D, level, format, width, height, 0, size, data); data += size; width >>= 1; height >>= 1; } } /*else { //cout << "Format:" << description.Format << endl; GLenum type; switch (description.Format) { case TextureFormatRgba: //cout << "GL_RGBA" << endl; assert(description.BitsPerComponent == 4); format = GL_RGBA; type = GL_UNSIGNED_SHORT_4_4_4_4; bitsPerPixel = 16; break; case TextureFormat565: //cout << "GL_RGB" << endl; format = GL_RGB; type = GL_UNSIGNED_SHORT_5_6_5; bitsPerPixel = 16; break; case TextureFormat5551: //cout << "GL_RGBA2" << endl; format = GL_RGBA; type = GL_UNSIGNED_SHORT_5_5_5_1; bitsPerPixel = 16; break; default: break; } for (int level = 0; level < description.MipCount; ++level) { GLsizei size = width * height * bitsPerPixel / 8; glTexImage2D(GL_TEXTURE_2D, level, format, width, height, 0, format, type, data); data += size; width >>= 1; height >>= 1; } }*/ _resourceManager->UnloadImage(); return description; }
void RenderingEngine::Initialize(const vector<ISurface*>& surfaces) { vector<ISurface*>::const_iterator surface; for (surface = surfaces.begin(); surface != surfaces.end(); ++surface) { // Create the VBO for the vertices. vector<float> vertices; unsigned char vertexFlags = VertexFlagsNormals | VertexFlagsTexCoords; (*surface)->GenerateVertices(vertices, vertexFlags); GLuint vertexBuffer; glGenBuffers(1, &vertexBuffer); glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer); glBufferData(GL_ARRAY_BUFFER, vertices.size() * sizeof(vertices[0]), &vertices[0], GL_STATIC_DRAW); // Create a new VBO for the indices if needed. int indexCount = (*surface)->GetTriangleIndexCount(); GLuint indexBuffer; if (!m_drawables.empty() && indexCount == m_drawables[0].IndexCount) { indexBuffer = m_drawables[0].IndexBuffer; } else { vector<GLushort> indices(indexCount); (*surface)->GenerateTriangleIndices(indices); glGenBuffers(1, &indexBuffer); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuffer); glBufferData(GL_ELEMENT_ARRAY_BUFFER, indexCount * sizeof(GLushort), &indices[0], GL_STATIC_DRAW); } Drawable drawable = { vertexBuffer, indexBuffer, indexCount}; m_drawables.push_back(drawable); } // Extract width and height from the color buffer. int width, height; glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_WIDTH_OES, &width); glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_HEIGHT_OES, &height); // Create a depth buffer that has the same size as the color buffer. glGenRenderbuffersOES(1, &m_depthRenderbuffer); glBindRenderbufferOES(GL_RENDERBUFFER_OES, m_depthRenderbuffer); glRenderbufferStorageOES(GL_RENDERBUFFER_OES, GL_DEPTH_COMPONENT16_OES, width, height); // Create the framebuffer object. GLuint framebuffer; glGenFramebuffersOES(1, &framebuffer); glBindFramebufferOES(GL_FRAMEBUFFER_OES, framebuffer); glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_RENDERBUFFER_OES, m_colorRenderbuffer); glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_DEPTH_ATTACHMENT_OES, GL_RENDERBUFFER_OES, m_depthRenderbuffer); glBindRenderbufferOES(GL_RENDERBUFFER_OES, m_colorRenderbuffer); void* pixels; ivec2 size; // Load the background texture. glGenTextures(1, &m_backgroundTexture); glBindTexture(GL_TEXTURE_2D, m_backgroundTexture); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); m_resourceManager->LoadPngImage("Background"); pixels = m_resourceManager->GetImageData(); size = m_resourceManager->GetImageSize(); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, size.x, size.y, 0, GL_RGB, GL_UNSIGNED_BYTE, pixels); m_resourceManager->UnloadImage(); // Load the checkboard texture. glGenTextures(1, &m_gridTexture); glBindTexture(GL_TEXTURE_2D, m_gridTexture); glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); m_resourceManager->LoadPngImage("Checkerboard"); pixels = m_resourceManager->GetImageData(); size = m_resourceManager->GetImageSize(); glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, size.x, size.y, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, pixels); m_resourceManager->UnloadImage(); // Set up various GL state. glEnableClientState(GL_VERTEX_ARRAY); glEnableClientState(GL_NORMAL_ARRAY); glEnableClientState(GL_TEXTURE_COORD_ARRAY); glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); glEnable(GL_DEPTH_TEST); glEnable(GL_TEXTURE_2D); // Set up the material properties. vec4 specular(0.5f, 0.5f, 0.5f, 1); glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, specular.Pointer()); glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, 50.0f); m_translation = mat4::Translate(0, 0, -7); }
void RenderingEngine::Initialize(const vector<ISurface*>& surfaces) { vector<ISurface*>::const_iterator surface; for (surface = surfaces.begin(); surface != surfaces.end(); ++surface) { // Create the VBO for the vertices. vector<float> vertices; (*surface)->GenerateVertices(vertices, VertexFlagsNormals|VertexFlagsTexCoords); GLuint vertexBuffer; glGenBuffers(1, &vertexBuffer); glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer); glBufferData(GL_ARRAY_BUFFER, vertices.size() * sizeof(vertices[0]), &vertices[0], GL_STATIC_DRAW); // Create a new VBO for the indices if needed. int indexCount = (*surface)->GetTriangleIndexCount(); GLuint indexBuffer; if (!m_drawables.empty() && indexCount == m_drawables[0].IndexCount) { indexBuffer = m_drawables[0].IndexBuffer; } else { vector<GLushort> indices(indexCount); (*surface)->GenerateTriangleIndices(indices); glGenBuffers(1, &indexBuffer); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuffer); glBufferData(GL_ELEMENT_ARRAY_BUFFER, indexCount * sizeof(GLushort), &indices[0], GL_STATIC_DRAW); } int lineIndexCount = (*surface)->GetLineIndexCount(); GLuint lineIndexBuffer; vector<GLushort> lineIndices(lineIndexCount); (*surface)->GenerateLineIndices(lineIndices); glGenBuffers(1, &lineIndexBuffer); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, lineIndexBuffer); glBufferData(GL_ELEMENT_ARRAY_BUFFER, lineIndexCount * sizeof(GLushort), &lineIndices[0], GL_STATIC_DRAW); Drawable drawable = { vertexBuffer, indexBuffer , indexCount}; m_drawables.push_back(drawable); } // Extract width and height. int width, height; glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_WIDTH, &width); glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_HEIGHT, &height); // Create a depth buffer that has the same size as the color buffer. glGenRenderbuffers(1, &m_depthRenderbuffer); glBindRenderbuffer(GL_RENDERBUFFER, m_depthRenderbuffer); glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, width, height); // Create the framebuffer object. GLuint framebuffer; glGenFramebuffers(1, &framebuffer); glBindFramebuffer(GL_FRAMEBUFFER, framebuffer); glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, m_colorRenderbuffer); glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, m_depthRenderbuffer); glBindRenderbuffer(GL_RENDERBUFFER, m_colorRenderbuffer); // Create the GLSL program. GLuint program = BuildProgram(SimpleVertexShader, SimpleFragmentShader); glUseProgram(program); // Extract the handles to attributes and uniforms. m_attributes.Position = glGetAttribLocation(program, "Position"); m_attributes.Normal = glGetAttribLocation(program, "Normal"); m_attributes.Diffuse = glGetAttribLocation(program, "DiffuseMaterial"); m_attributes.TextureCoord = glGetAttribLocation(program, "TextureCoord"); m_uniforms.Projection = glGetUniformLocation(program, "Projection"); m_uniforms.Modelview = glGetUniformLocation(program, "Modelview"); m_uniforms.NormalMatrix = glGetUniformLocation(program, "NormalMatrix"); m_uniforms.LightPosition = glGetUniformLocation(program, "LightPosition"); m_uniforms.AmbientMaterial = glGetUniformLocation(program, "AmbientMaterial"); m_uniforms.SpecularMaterial = glGetUniformLocation(program, "SpecularMaterial"); m_uniforms.Shininess = glGetUniformLocation(program, "Shininess"); // Set up some default material parameters. glUniform3f(m_uniforms.AmbientMaterial, 0.04f, 0.04f, 0.04f); glUniform3f(m_uniforms.SpecularMaterial, 0.5, 0.5, 0.5); glUniform1f(m_uniforms.Shininess, 50); // Set the active sampler to stage 0. Not really necessary since the uniform // defaults to zero anyway, but good practice. glActiveTexture(GL_TEXTURE0); glUniform1i(m_uniforms.Sampler, 0); // Load the texture. glGenTextures(1,&m_gridTexture); glBindTexture(GL_TEXTURE_2D, m_gridTexture); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); m_resourceManager = CreateResourceManager(); m_resourceManager->LoadPngImage("Grid16.png"); void* pixels = m_resourceManager->GetImageData(); ivec2 size = m_resourceManager->GetImageSize(); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, size.x, size.y, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels); m_resourceManager->UnloadImage(); // Initialize various state. glEnableVertexAttribArray(m_attributes.Position); glEnableVertexAttribArray(m_attributes.Normal); glEnableVertexAttribArray(m_attributes.TextureCoord); glEnable(GL_DEPTH_TEST); // Set up transforms. m_translation = mat4::Translate(0, 0, -7); }