首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >利用土壤OGL函数和OpenGL加载纹理

利用土壤OGL函数和OpenGL加载纹理
EN

Stack Overflow用户
提问于 2013-06-04 21:04:15
回答 5查看 19K关注 0票数 3

我有一个功能,从JPEG图像加载纹理使用土壤。

到目前为止,我已经用SOIL_load_image()函数加载纹理,然后使用glTexImage2D将图像提供给OpenGL (参见下面的代码)。不过!我的纹理是颠倒的,所以我想用SOIL_load_OGL_texture()代替,并提供SOIL_FLAG_INVERT_Y,以翻转图像。不过,我的问题是,我在SOIL_load_OGL_texture()函数中得到了一个未处理的异常。

代码几乎是文档中的复制粘贴,所以我不明白为什么会发生此错误?

(注意:我可以在我的顶点着色器中反演纹理,但我想使用土壤。)

老路

代码语言:javascript
复制
int width;
int height;

glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, textures[0]);

image = SOIL_load_image(filename, &width, &height, 0, SOIL_LOAD_RGB);

if (image == NULL) {
    std::cout << "An error occurred while loading image." << std::endl;
    exit(EXIT_FAILURE);
}
std::cout << "Loaded first texture image" << std::endl;

glPixelStorei(GL_UNPACK_ALIGNMENT, 1);

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, image);
SOIL_free_image_data(image);

我现在在尝试什么,

代码语言:javascript
复制
GLuint image;

glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, textures[0]);

image = SOIL_load_OGL_texture(
        filename,
        SOIL_LOAD_RGB,
        SOIL_CREATE_NEW_ID,
        SOIL_FLAG_INVERT_Y
    );

if (image == 0)
    cerr << "SOIL loading error: '" << SOIL_last_result() << "' (" << "res_texture.png" << ")" << endl;

与误差

代码语言:javascript
复制
Unhandled exception at 0x0F5427FF (msvcr110d.dll) in AnotherTutorial.exe: 0xC0000005: Access violation reading location 0x00000000.
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2013-06-05 15:00:39

似乎没有使用土壤的答案,所以我将张贴我的解决方案:

在顶点着色器中我这样做:

代码语言:javascript
复制
Texcoord = vec2(texcoord.x, 1.0-texcoord.y);
gl_Position = proj * view * model * vec4( position, 1.0 );

1.0坐标文本.y反转图像的y轴。不太干净的解决方案,但它有效。

票数 1
EN

Stack Overflow用户

发布于 2013-09-30 11:48:09

代码语言:javascript
复制
void loadTexture(GLuint* texture, char* path){
    *texture = SOIL_load_OGL_texture(filename,
                                     SOIL_LOAD_AUTO,
                                     SOIL_CREATE_NEW_ID,
                                     SOIL_FLAG_NTSC_SAFE_RGB | SOIL_FLAG_MULTIPLY_ALPHA
                                    );
    if(*textre == NULL){
        printf("[Texture loader] \"%s\" failed to load!\n", filename);
    }
}

void drawTexturedRect(int x, int y, int w, int h, GLuint texture){
    glEnable(GL_TEXTURE_2D);
    glBindTexture(GL_TEXTURE_2D, texture);
    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    glDepthMask(GL_FALSE);
    glDisable(GL_DEPTH_TEST);
    glBegin(GL_QUADS);
        glColor3f(255,255,255);
        glTexCoord2f(0,0);
        glVertex2f(x,y);
        glTexCoord2f(1,0);
        glVertex2f(x+w,y);
        glTexCoord2f(0,1);
        glVertex2f(x,y+h);
        glTexCoord2f(1,1);
        glVertex2f(x+w,y+h);
        glTexCoord2f(0,1);
        glVertex2f(x,y+h);
    glEnd();
    glEnable(GL_DEPTH_TEST);
    glDepthMask(GL_TRUE);
    glDisable(GL_BLEND);
}

然后你就可以:

代码语言:javascript
复制
// At initialization
GLuint texture;
loadTexture(&texture, "filename.png");

// Drawing part
drawTexturedRect(25,25,256,256,texture);

这是我个人使用的,它工作得很完美。我正在使用Visual 2012与SDL和SOIL相结合。

票数 1
EN

Stack Overflow用户

发布于 2013-12-27 01:53:06

SOIL_load_image将返回unsigned char*是,数组保存您的图像数据。

然后,通常使用gl将这些数据提供给glGenerateTextures,分配纹理ID,调用glTexImage2D

SOIL_load_OGL_texture返回一个纹理id,因此您可以这样做:

代码语言:javascript
复制
texture[0] = SOIL_load_OGL_texture(...)

如果你的目标是加载纹理0,1,2。

至于反演y,最简单和无重量的解决方案是翻转纹理坐标在glTexCoord,但这取决于你在做什么。如果您只是将资源加载为一次操作或类似的操作,则不会造成伤害,除非一些启动时间可能不值得提及。但是,如果您在需要时通过主循环动态地加载资源,那么反转y标志(以及任何标志)可能会影响性能,因为整个程序都需要进行额外的处理。

使用SOIL_load_image的一个大优点是,您可以从原始图像中检索SOIL_load_OGL_texture不提供的宽度、高度和通道号。

如果有帮助的话,SOIL_load_OGL_texture在将RGB图像加载为RGB时会在一段时间后崩溃,但是在使用SOIL_LOAD_RGBA的过程中工作得很好,这可能是解决问题的一个方法。

我仍然觉得用SOIL_load_image更容易。我希望这些都能帮上忙。还可以查看随土一起提供的土壤源代码,看看到底发生了什么。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16927442

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档