VtxColorProgram::VtxColorProgram(const MaterialDescriptor &desc) { m_name = "vtxColor"; CheckRenderErrors(); LoadShaders(m_name, m_defines); InitUniforms(); }
bool RendererOGL::SetRenderState(RenderState *rs) { if (m_activeRenderState != rs) { static_cast<OGL::RenderState*>(rs)->Apply(); m_activeRenderState = rs; } CheckRenderErrors(); return true; }
TextureGL::TextureGL(const TextureDescriptor &descriptor, const bool useCompressed) : Texture(descriptor) { m_target = GLTextureType(descriptor.type); glGenTextures(1, &m_texture); glBindTexture(m_target, m_texture); CheckRenderErrors(); // useCompressed is the global scope flag whereas descriptor.allowCompression is the local texture mode flag // either both or neither might be true however only compress the texture when both are true. const bool compressTexture = useCompressed && descriptor.allowCompression; switch (m_target) { case GL_TEXTURE_2D: if (!IsCompressed(descriptor.format)) { if (!descriptor.generateMipmaps) glTexParameteri(m_target, GL_TEXTURE_MAX_LEVEL, 0); CheckRenderErrors(); glTexImage2D( m_target, 0, compressTexture ? GLCompressedInternalFormat(descriptor.format) : GLInternalFormat(descriptor.format), descriptor.dataSize.x, descriptor.dataSize.y, 0, GLImageFormat(descriptor.format), GLImageType(descriptor.format), 0); CheckRenderErrors(); if (descriptor.generateMipmaps) glGenerateMipmap(m_target); CheckRenderErrors(); } else { const GLint oglFormatMinSize = GetMinSize(descriptor.format); size_t Width = descriptor.dataSize.x; size_t Height = descriptor.dataSize.y; size_t bufSize = ((Width + 3) / 4) * ((Height + 3) / 4) * oglFormatMinSize; GLint maxMip = 0; for( unsigned int i=0; i < descriptor.numberOfMipMaps; ++i ) { maxMip = i; glCompressedTexImage2D(GL_TEXTURE_2D, i, GLInternalFormat(descriptor.format), Width, Height, 0, bufSize, 0); if( Width<=MIN_COMPRESSED_TEXTURE_DIMENSION || Height<=MIN_COMPRESSED_TEXTURE_DIMENSION ) { break; } bufSize /= 4; Width /= 2; Height /= 2; } glTexParameteri(m_target, GL_TEXTURE_MAX_LEVEL, maxMip); CheckRenderErrors(); } break; case GL_TEXTURE_CUBE_MAP: if(!IsCompressed(descriptor.format)) { if(descriptor.generateMipmaps) glTexParameteri(m_target, GL_TEXTURE_MAX_LEVEL, 0); CheckRenderErrors(); glTexImage2D( GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, compressTexture ? GLCompressedInternalFormat(descriptor.format) : GLInternalFormat(descriptor.format), descriptor.dataSize.x, descriptor.dataSize.y, 0, GLImageFormat(descriptor.format), GLImageType(descriptor.format), 0); glTexImage2D( GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, compressTexture ? GLCompressedInternalFormat(descriptor.format) : GLInternalFormat(descriptor.format), descriptor.dataSize.x, descriptor.dataSize.y, 0, GLImageFormat(descriptor.format), GLImageType(descriptor.format), 0); glTexImage2D( GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, compressTexture ? GLCompressedInternalFormat(descriptor.format) : GLInternalFormat(descriptor.format), descriptor.dataSize.x, descriptor.dataSize.y, 0, GLImageFormat(descriptor.format), GLImageType(descriptor.format), 0); glTexImage2D( GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, compressTexture ? GLCompressedInternalFormat(descriptor.format) : GLInternalFormat(descriptor.format), descriptor.dataSize.x, descriptor.dataSize.y, 0, GLImageFormat(descriptor.format), GLImageType(descriptor.format), 0); glTexImage2D( GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, compressTexture ? GLCompressedInternalFormat(descriptor.format) : GLInternalFormat(descriptor.format), descriptor.dataSize.x, descriptor.dataSize.y, 0, GLImageFormat(descriptor.format), GLImageType(descriptor.format), 0); glTexImage2D( GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, compressTexture ? GLCompressedInternalFormat(descriptor.format) : GLInternalFormat(descriptor.format), descriptor.dataSize.x, descriptor.dataSize.y, 0, GLImageFormat(descriptor.format), GLImageType(descriptor.format), 0); CheckRenderErrors(); if (descriptor.generateMipmaps) glGenerateMipmap(m_target); CheckRenderErrors(); } else { const GLint oglFormatMinSize = GetMinSize(descriptor.format); size_t Width = descriptor.dataSize.x; size_t Height = descriptor.dataSize.y; size_t bufSize = ((Width + 3) / 4) * ((Height + 3) / 4) * oglFormatMinSize; GLint maxMip = 0; for( unsigned int i=0; i < descriptor.numberOfMipMaps; ++i ) { maxMip = i; glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, i, GLInternalFormat(descriptor.format), Width, Height, 0, bufSize, 0); glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, i, GLInternalFormat(descriptor.format), Width, Height, 0, bufSize, 0); glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, i, GLInternalFormat(descriptor.format), Width, Height, 0, bufSize, 0); glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, i, GLInternalFormat(descriptor.format), Width, Height, 0, bufSize, 0); glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, i, GLInternalFormat(descriptor.format), Width, Height, 0, bufSize, 0); glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, i, GLInternalFormat(descriptor.format), Width, Height, 0, bufSize, 0); if( Width<=MIN_COMPRESSED_TEXTURE_DIMENSION || Height<=MIN_COMPRESSED_TEXTURE_DIMENSION ) { break; } bufSize /= 4; Width /= 2; Height /= 2; } glTexParameteri(m_target, GL_TEXTURE_MAX_LEVEL, maxMip); CheckRenderErrors(); } break; default: assert(0); } CheckRenderErrors(); GLenum magFilter, minFilter, wrapS, wrapT; switch (descriptor.sampleMode) { default: // safe default will fall through to LINEAR_CLAMP when run in release builds without assert assert(0); case LINEAR_CLAMP: magFilter = GL_LINEAR; minFilter = descriptor.generateMipmaps ? GL_LINEAR_MIPMAP_LINEAR : GL_LINEAR; wrapS = wrapT = GL_CLAMP_TO_EDGE; break; case NEAREST_CLAMP: magFilter = GL_NEAREST; minFilter = descriptor.generateMipmaps ? GL_NEAREST_MIPMAP_NEAREST : GL_NEAREST; wrapS = wrapT = GL_CLAMP_TO_EDGE; break; case LINEAR_REPEAT: magFilter = GL_LINEAR; minFilter = descriptor.generateMipmaps ? GL_LINEAR_MIPMAP_LINEAR : GL_LINEAR; wrapS = wrapT = GL_REPEAT; break; case NEAREST_REPEAT: magFilter = GL_NEAREST; minFilter = descriptor.generateMipmaps ? GL_NEAREST_MIPMAP_NEAREST : GL_NEAREST; wrapS = wrapT = GL_REPEAT; break; } glTexParameteri(m_target, GL_TEXTURE_WRAP_S, wrapS); glTexParameteri(m_target, GL_TEXTURE_WRAP_T, wrapS); glTexParameteri(m_target, GL_TEXTURE_MAG_FILTER, magFilter); glTexParameteri(m_target, GL_TEXTURE_MIN_FILTER, minFilter); CheckRenderErrors(); }