【问题标题】:Draw Completely White Texture in OpenGL在 OpenGL 中绘制完全白色的纹理
【发布时间】:2015-11-14 20:30:08
【问题描述】:

我想要做的是在 OpenGL 中像正常一样绘制纹理,但完全是白色的。我尝试做glColor3f(2.f, 2.f, 2.f),但这不起作用。我只想绘制某种纹理的形状,但没有颜色,只有白色,所以我试图绘制纹理,但白色......

为了澄清期望的结果:我希望从纹理中采样的所有颜色的 RGB 部分为白色,而 alpha 值是从纹理中采样的颜色。所以如果纹理中的值为(R, G, B, A),我希望采样颜色为(1.0f, 1.0f, 1.0f, A)。

【问题讨论】:

  • 我不清楚你想做什么。如果您想将整个形状渲染为白色,为什么要首先使用纹理? “纹理的形状”是什么意思?纹理本质上只是图像,它们的形状总是矩形的。
  • 我的意思是,如果一个像素为 127 透明,则绘制一个 127 透明度的白色像素,如果一个像素为 255 透明,则绘制一个 255 透明度的白色像素等

标签: c++ opengl colors draw game-engine


【解决方案1】:

要将颜色从纹理变为白色,但仍使用从纹理采样的 alpha 值,您可以使用:

glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_ADD);
glColor4f(1.0f, 1.0f, 1.0f, 1.0f);

使用GL_ADD 纹理环境模式,传入的片​​段颜色(上面的第二个调用设置为白色)将添加到从纹理采样的颜色中以获得输出颜色。由于输出颜色被限制在 [0.0, 1.0] 范围内,因此纹理中的颜色分量无关紧要,因为它们会在结果被限制为 1.0 之前添加到 1.0。因此输出的 RGB 颜色部分将始终为白色。

不太明显的部分是 alpha 值发生了什么变化。根据规范,对于GL_ADD 纹理环境模式,来自传入片段的 alpha 值和从纹理采样的 alpha 值相乘。将片段 alpha 设置为 1.0,这意味着结果值是纹理中的 alpha 值,这正是您想要的。

【讨论】:

    【解决方案2】:

    使用像素着色器并将每个片段的颜色设置为白色。

    【讨论】:

    • 您是否尝试从加载到内存中的文件渲染纹理,例如从 tga、png 或 bmp 文件中读取;还是您只是想为您的对象添加白色“材质”?
    • (...继续) 使用 2D 和 3D 图形时,纹理和材质之间存在差异。纹理从文件加载到内存中并映射到您的渲染对象,其中可以将材质应用于同一对象。假设您有一个 3D 盒子,它使用映射到它的板条箱的纹理进行渲染:如果您的材质是白色的,那么纹理将按原样显示。如果您为材质添加颜色,它会将纹理着色为材质中的颜色。
    • (...continued) 唯一的材质有不同的设置,如环境、漫反射、镜面反射、自发光等,因为使用 OpenGL 你必须创建如果您正在使用不涉及着色器的旧版本的 OpenGL,则您自己的光源。在使用照明时,您还必须跟踪和管理正常。
    • 着色器很烦人。 +1 好玩,但你真的需要停止使用 vanilla GL 1.1/2.0 并开始使用这些技术。当然还有更多样板,但自 1994 年以来,事情一直在发展。现代技术要强大得多。
    【解决方案3】:

    在代码中创建一个 1x1 白色 RGBA 位图。

    GLubyte texData[] = { 255, 255, 255, 255 };
    

    将数据复制到纹理。

    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, texData);
    

    【讨论】:

    • 我不是要画一个白色的正方形,“我的意思是,如果一个像素是 127 透明的,那么画一个 127 透明度的白色像素,如果一个像素是 255 透明的,那么画一个白色像素255 透明度等”基于我想要制作白色的图像。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-30
    相关资源
    最近更新 更多