示例#1
0
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");
}
示例#2
0
文件: texture.cpp 项目: ehalls/xoreos
void Texture::doRebuild() {
	if (!_image)
		// No image
		return;

	// Generate the texture ID
	if (_textureID == 0)
		glGenTextures(1, &_textureID);

	if (_image->isCubeMap()) {
		createCubeMapTexture();
		return;
	}

	create2DTexture();
}
示例#3
0
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;
}
示例#4
0
// �뀺�씠�뜑�� �봽濡쒓렇�옩 媛앹껜 珥덇린�솕.
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;
}