【问题标题】:Conversion to Cinder gl::Texture转换为 Cinder gl::Texture
【发布时间】:2014-10-06 03:47:46
【问题描述】:

我正在尝试使用图像数据作为 BYTE * 创建一个 gl::Texture 对象,参数如下。

FreeGLUT - 我使用它来创建 2d 纹理并将其绑定到四边形。:

 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, textureWidth, textureHeight, 0, GL_BGRA_EXT,   GL_UNSIGNED_BYTE, data);
 glBindTexture(GL_TEXTURE_2D, 0); etc etc

这很好用,但是我找不到在 Cinder 中创建 gl::Texture 对象的方法。

 text = gl::Texture(loadImage(loadAsset("text.jpg"))); // works with images files
 text = gl::Texture(data, GL_RGBA8, 640, 480); // BTYE * data This gives me a grey screen -

这似乎是最有可能的,但是我不知道如何处理 Format format = format();

Texture (const unsigned char *data, int dataFormat, int aWidth, int aHeight, Format format=Format()) 

我真的不了解它是如何工作的,也无法在网上找到更好的教程。谢谢。

【问题讨论】:

    标签: c++ opengl cinder


    【解决方案1】:

    显然dataFormat 是glTexImage2D 的格式参数,应该类似于GL_RGBAGL_RGB(或您提供的示例中的GL_BGRA_EXT

    您想要的是通过Format 结构设置的“内部格式”。所以你把它设置为:

    gl::Texture::Format fmt;
    fmt.setInternalFormat(GL_RGBA8);
    text = gl::Texture(data, GL_RGBA, 640, 480, fmt);
    

    GL_UNSIGNED_BYTE 格式已在 cinder 包装器的构造函数中预设

    有时只看代码而不是试图找到 100% 适用的文档会更容易

    【讨论】:

    • 非常感谢。你的回答是有道理的,但是当我调用 gl::draw(text, getWindowBounds());我仍然得到一个灰色的背景。它在使用 gl::Texture(loadImage from a file。还有什么我需要做不同的事情吗?在 freeGLUT 中,我将纹理映射到四边形但我的理解是纹理应该与 gl::draw 正常工作(如我从文件加载的纹理正确显示)。
    • @user1546650 我想确保data 确实指向图像数据是相当重要的,使用你的调试器看看那里的值是否有意义。
    • 谢谢,看起来剩下的问题是我的主代码中的一个错误(我确实尝试检查调试器,但不太确定我在寻找什么:P)。
    • @user1546650 如果您不知道如何在调试器中检查指向的数据,那么只需在代码中进行调试以进行调试(即 printf 调试)。就像为一些有意义的值做 std::cout << (int)data[100] << (int)data[101] << (int)data[102]; 一样。当然还要检查data 本身(它是否指向0 或其他一些垃圾位置)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-22
    • 1970-01-01
    • 2012-11-06
    • 1970-01-01
    相关资源
    最近更新 更多