【问题标题】:Colorize a greyscale texture in OpenGL ES on Android在 Android 上的 OpenGL ES 中为灰度纹理着色
【发布时间】:2012-02-03 02:10:08
【问题描述】:

我想使用类似于 Photoshop 风格画笔的纹理(例如:http://designblurb.com/wp-content/uploads/2008/11/grungy-watercolor-brushes.jpg),并允许用户为其选择颜色,因此当它被绘制到屏幕上时,灰色的黑色会被用户的选择。

有谁知道实现这一目标的最佳方法?是否有纹理环境变量可以做到这一点?

非常感谢任何信息。

【问题讨论】:

    标签: android opengl-es colors mask brush


    【解决方案1】:

    嗯,它只是将纹理的颜色与一些恒定的颜色结合起来。所以你有灰度纹理(要么是 GL_RGB 纹理,颜色的所有成分都具有相同的值,要么只是 GL_LUMINANCE 纹理)。两种颜色的实际组合取决于您的 OpenGL ES 版本。

    在 ES 1 中,您只需使用 GL_MODULATE 纹理环境将纹理颜色与对象/顶点的颜色相乘(通过光照计算或由 glColorglColorPointer 设置,如果光照被禁用,这似乎是您的案例):

    glColor(...);
    glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
    //draw a textured object
    

    在 ES 2 中你当然必须在片段着色器中自己做:

    uniform sampler2D tex;
    uniform vec4 color;
    
    varying vec2 texCoord;
    
    void main()
    {
        gl_FragColor = color * texture2D(tex, texCoord).r;
    }
    

    如果所有这些都没有告诉您任何信息(取决于您的版本),那么您可能应该深入研究 OpenGL ES 的基础知识,并且将纹理与恒定颜色组合起来是您的最小问题。

    【讨论】:

    • 啊哈哈,现在确实看到效果了,不过好像因为材质主要是黑色,所以颜色的效果不大。我想知道是否有不同的环境变量或混合函数可以创建更强烈的颜色,或者我应该减轻画笔灰度蒙版?
    • @TomPennetta 好吧,颜色当然是画笔为白色的地方。如果您的画笔将黑色表示为颜色(您的图像以某种方式暗示),则需要切换颜色。如果你想让它更亮,你也应该把它变亮。确切的颜色仅由完全白色的部分给出,其他一切只能更暗。您可以尝试使用 alpha 混合来获得附加效果(用画笔多次绘制时,部分会更亮),但我不知道这是否是您想要的。
    • 明白了,我习惯了Photoshop,画笔越深颜色越强。感谢您的信息!
    • @TomPennetta 由于颜色是相乘的,颜色乘以 1(白色)得到颜色,颜色乘以 0(黑色)得到黑色。
    • 非常有意义。它似乎正在按预期的方式工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-04
    • 2015-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多