TGen::Texture * TGen::OpenGL::Renderer::createTexture(const void * data, const TGen::Rectangle & size, TGen::ImageFormat format, TGen::ImageFormat components, TGen::FormatType componentFormat, uint flags) { GLenum internalFormat = TGen::OpenGL::TgenImageFormatToOpenGL(format); GLenum inFormat = TGen::OpenGL::TgenImageFormatToOpenGL(components); GLenum dataType = TGen::OpenGL::TgenFormatToOpenGL(componentFormat); if (format == TGen::DEPTH16) { internalFormat = GL_DEPTH_COMPONENT16; inFormat = GL_DEPTH_COMPONENT; } else if (format == TGen::DEPTH24) { internalFormat = GL_DEPTH_COMPONENT24; inFormat = GL_DEPTH_COMPONENT; } else if (format == TGen::DEPTH32) { internalFormat = GL_DEPTH_COMPONENT32; inFormat = GL_DEPTH_COMPONENT; } // TODO: this won't be exact, the driver might do padding! who knows?! // TODO: fixa ADD_VAL(negative) i ~Texture... PSTAT_ADD_VAL(TGen::StatTextureAlloc, TGen::FormatTypeSize(componentFormat) * size.width * size.height); if (flags & TGen::TextureRectangle) { return createRectTexture(data, size, internalFormat, inFormat, dataType, flags); } else { return create2DTexture(data, size, internalFormat, inFormat, dataType, flags); } throw TGen::RuntimeException("OpenGL::Renderer::createTexture", "failed to create texture, unknown texture type"); }
void Texture::doRebuild() { if (!_image) // No image return; // Generate the texture ID if (_textureID == 0) glGenTextures(1, &_textureID); if (_image->isCubeMap()) { createCubeMapTexture(); return; } create2DTexture(); }
Texture* TextureReaderDevil::loadTexture(const std::string& filename, Texture::Filter filter, bool compress, bool keepPixels, bool createOGLTex, bool textureRectangle) { #ifndef GL_TEXTURE_RECTANGLE_ARB if (textureRectangle){ LERROR("Texture Rectangles not supported!"); textureRectangle = false; } #endif File* file = FileSys.open(filename); // check if file is open if (!file || !file->isOpen()) { delete file; return 0; } size_t len = file->size(); // check if file is empty if (len == 0) { delete file; return 0; } // allocate memory char* imdata = new char[len]; if (imdata == 0) { delete file; return 0; // allocation failed } file->read(imdata, len); file->close(); delete file; /* FIXME: I think the keepPixels option does not work properly -> I don't see why...afaik keepPixels has been used in some project (stefan) */ ILuint ImageName; ilGenImages(1, &ImageName); ilBindImage(ImageName); Texture* t = new Texture(); t->setName(filename); if (!ilLoadL(IL_TYPE_UNKNOWN, imdata, static_cast<ILuint>(len))) { LERROR("Failed to open via ilLoadL " << filename); delete[] imdata; delete t; return 0; } delete[] imdata; imdata = 0; t->setBpp(ilGetInteger(IL_IMAGE_BYTES_PER_PIXEL)); // determine image format ILint devilFormat; switch (ilGetInteger(IL_IMAGE_FORMAT)) { case IL_LUMINANCE: // intensity channel only devilFormat = IL_LUMINANCE; t->setFormat(GL_LUMINANCE); break; case IL_LUMINANCE_ALPHA: // intensity-alpha channels devilFormat = IL_LUMINANCE_ALPHA; t->setFormat(GL_LUMINANCE_ALPHA); break; case IL_RGB: devilFormat = IL_RGB; // three color channels t->setFormat(GL_RGB); break; case IL_RGBA: devilFormat = IL_RGBA; // color-alpha channels t->setFormat(GL_RGBA); break; case IL_BGR: devilFormat = IL_RGB; // B-G-R ordered color channels, convert to RGB t->setFormat(GL_RGB); break; case IL_BGRA: devilFormat = IL_RGBA; // R-G-B-A ordered color channels, convert to RGBA t->setFormat(GL_RGBA); break; default: LERROR("unsupported format: " << ilGetInteger(IL_IMAGE_FORMAT) << " (" << filename << ")"); delete t; return 0; } // determine data type ILint devilDataType; switch (ilGetInteger(IL_IMAGE_TYPE)) { case IL_UNSIGNED_BYTE: devilDataType = IL_UNSIGNED_BYTE; t->setDataType(GL_UNSIGNED_BYTE); break; case IL_BYTE: devilDataType = IL_BYTE; t->setDataType(GL_BYTE); break; case IL_UNSIGNED_SHORT: devilDataType = IL_UNSIGNED_SHORT; t->setDataType(GL_UNSIGNED_SHORT); break; case IL_SHORT: devilDataType = IL_SHORT; t->setDataType(GL_SHORT); break; case IL_UNSIGNED_INT: devilDataType = IL_UNSIGNED_INT; t->setDataType(GL_UNSIGNED_INT); break; case IL_INT: devilDataType = IL_INT; t->setDataType(GL_INT); break; case IL_FLOAT: devilDataType = IL_FLOAT; t->setDataType(GL_FLOAT); break; default: LERROR("unsupported data type: " << ilGetInteger(IL_IMAGE_TYPE) << " (" << filename << ")"); delete t; return 0; } if (!ilConvertImage(devilFormat, devilDataType)) { LERROR("failed to convert loaded image: " << filename); delete t; return 0; } tgt::ivec3 dims; dims.x = ilGetInteger(IL_IMAGE_WIDTH); dims.y = ilGetInteger(IL_IMAGE_HEIGHT); dims.z = ilGetInteger(IL_IMAGE_DEPTH); t->setDimensions(dims); LDEBUG("Image dimensions: " << t->getDimensions()); tgtAssert( dims.z == 1, "depth is not equal 1"); #ifdef GL_TEXTURE_RECTANGLE_ARB if (textureRectangle) t->setType( GL_TEXTURE_RECTANGLE_ARB ); else #endif t->setType( GL_TEXTURE_2D ); t->alloc(); memcpy(t->getPixelData(), ilGetData(), t->getArraySize()); bool success; if (textureRectangle) success = createRectangleTexture(t, filter, compress, createOGLTex); else { if (dims.y == 1) success = create1DTexture(t, filter, compress, createOGLTex); else success = create2DTexture(t, filter, compress, createOGLTex); } if (!success) { ilDeleteImages(1, &ImageName); if (!keepPixels) t->setPixelData(0); delete t; return 0; } ilDeleteImages(1, &ImageName); if (!keepPixels) { delete[] t->getPixelData(); t->setPixelData(0); } return t; }
// �뀺�씠�뜑�� �봽濡쒓렇�옩 媛앹껜 珥덇린�솕. int InitShaderAndProgram() { if (!mUserData) return 0; char* vShaderStr = AssetManager::getInstance()->readFile( "YHBumpShader.vert"); char* fShaderStr = AssetManager::getInstance()->readFile( "YHBumpShader.frag"); GLuint vertexShader; GLuint fragmentShader; GLuint programObject; GLint linked; // �젙�젏怨� �봽�옒洹몃㉫�듃 �뀺�씠�뜑 �쟻�옱. vertexShader = LoadShader(GL_VERTEX_SHADER, vShaderStr); fragmentShader = LoadShader(GL_FRAGMENT_SHADER, fShaderStr); // �봽濡쒓렇�옩 媛앹껜 �깮�꽦. programObject = glCreateProgram(); if (programObject == 0) return 0; glAttachShader(programObject, vertexShader); glAttachShader(programObject, fragmentShader); // �봽濡쒓렇�옩 留곹겕. glLinkProgram(programObject); // 留곹겕 �긽�깭 �젏寃�. glGetProgramiv(programObject, GL_LINK_STATUS, &linked); if (!linked) { GLint infoLen = 0; glGetProgramiv(programObject, GL_INFO_LOG_LENGTH, &infoLen); if (infoLen > 1) { char* infoLog = (char*) malloc(sizeof(char) * infoLen); glGetProgramInfoLog(programObject, infoLen, NULL, infoLog); ALOGE("Error linking program : %s", infoLog); free(infoLog); } glDeleteProgram(programObject); return false; } // �봽濡쒓렇�옩 媛앹껜 ���옣. mUserData->programObject = programObject; // Vertex Shader 遺�遺�. mUserData->uModelInverseLocation = glGetUniformLocation( mUserData->programObject, "u_matModelInverse"); mUserData->uViewInverseLocation = glGetUniformLocation( mUserData->programObject, "u_matViewInverse"); mUserData->uViewProjectionLocation = glGetUniformLocation( mUserData->programObject, "u_matViewProjection"); mUserData->uLightPosLocation = glGetUniformLocation( mUserData->programObject, "u_lightPosition"); mUserData->uEyePosLocation = glGetUniformLocation(mUserData->programObject, "u_eyePosition"); mUserData->mvpLoc = glGetUniformLocation(mUserData->programObject, "u_mvpMatrix"); // Fragment Shader 遺�遺�. mUserData->uAmbientLocation = glGetUniformLocation(mUserData->programObject, "u_ambient"); mUserData->uSpecularLocation = glGetUniformLocation( mUserData->programObject, "u_specular"); mUserData->uDiffuseLocation = glGetUniformLocation(mUserData->programObject, "u_diffuse"); mUserData->uSpecularPowerLocation = glGetUniformLocation( mUserData->programObject, "u_specularPower"); mUserData->sBaseMapLocation = glGetUniformLocation(mUserData->programObject, "s_baseMap"); mUserData->sNormalMapLocation = glGetUniformLocation( mUserData->programObject, "s_normalMap"); // �뀓�뒪爾� 濡쒕뵫. mUserData->textureId[0] = create2DTexture("earth_texture.tga", 1280, 640, GL_RGB, GL_RGB, true); mUserData->textureId[1] = create2DTexture("earth_normal.tga", 1280, 640, GL_RGB, GL_RGB, true); glEnable(GL_CULL_FACE); glCullFace(GL_BACK); // Sphere �깮�꽦. mNumberOfIndices = esGenSphere(50, 1, &mSphereVertices, &mSphereNormal, &mSphereBinormal, &mSphereTangent, &mSphereTexCoords, &mSphereIndices); return true; }