我正在使用OpenGL ES 1.1在我的iPad应用程序中画线。我想要确保画出的线条总是在屏幕上可见,而不管背景颜色如何,并且不允许用户选择颜色。是否有混合功能可以产生这种效果?所以绘制线的颜色将根据已绘制的颜色而变化,因此始终可见。OpenGL ES混合函数所以颜色总是显示背景
回答
不幸的是,片段最终融合到帧缓冲区仍然是固定功能。此外,glLogicOp
没有在ES中实现,所以你不能做像XOR绘图这样便宜的东西。
我觉得最终效果是:
- 你想要的输出颜色是颜色已经在帧缓冲区的自定义功能;
- 但帧缓冲区不能在着色器中读取(它会中断流水线并导致并发问题)。
因此,你将不得不实施乒乓管道。
你有两个离屏缓冲区。一个代表您输出的最后一帧,另一个代表您在此之前输出帧的内容。
生成一个新的帧,使用前一帧表示的帧作为输入。因为它是一个输入,所以你可以在任何你想要的地方对它进行采样,并对它进行任何你喜欢的计算。你渲染到你拥有的其他缓冲区(即更老的缓冲区),因为你不再关心它的内容。
然后,您将所有内容复制到屏幕上,并将两者交换,这意味着您刚绘制的内容仍然位于纹理中,以指代您绘制的最后一帧。你刚刚提到的内容成为你的下一个绘图目标,因为这是你方便已经存在的东西。
因此,您将立即对呈现纹理感兴趣。您还需要决定要使用哪种功能为现有背景选择合适的“不同”颜色。也许只是颠倒它会做什么?
我觉得这可能是工作:
glBlendFunc(GL_ONE_MINUS_DST_COLOR, GL_ZERO);
用白色画出你的线,然后将结果将呈现为
[1,1,1,1] * (1 - [DstR, DstG, DstB, DstA]) + ([DstR, DstG, DstB, DstA] * 0)
这应该呈现黑色像素其中背景为白色,背景为黑色的白色像素,背景为蓝色的黄色像素等。
当我试过这个东西时,它使橡皮擦,这意味着无论我刷笔刷哪里都是透明的。此外,它不再将纹理应用于画笔。我不认为我在执行你的想法错误.. glBlendFunc(GL_ONE_MINUS_DST_COLOR,GL_ZERO); glColor4f(1.0f,1.0f,1.0f,1.0f); –
你的评论听起来不像你原来的问题。什么刷子?我以为你在画线。你是什么意思,它'不应用纹理刷'?你没有提到有关纹理的任何内容。 – Tim
好的抱歉,我不知道我在这个问题上有多少细节。我正在绘制线条,但使用“笔刷”(类似于流行的GLPaint示例)。 “画笔”使用一种纹理,对画出的线条应用了不错的形状。我并不认为这些信息会影响我正在尝试做的事情,因此我将它排除在外。对困惑感到抱歉。并且,“不应用纹理刷”,我的意思是现在正在绘制纹理的大小的正方形而不是纹理内的形状,但这不是一个问题。 –
- 1. 背景颜色并不总是显示
- 2. OpenGL混合单色颜色
- 3. Android ListView的背景颜色总是显示灰色
- 4. Qt样式表背景颜色总是显示为黑色
- 5. OpenGL ES 1.0上的混合函数(Android)
- 6. OpenGL背景颜色推子
- 7. 通过背景颜色在文字上显示背景颜色
- 8. OpenGL ES的颜色
- 9. 混合OpenGL ES 1和OpenGL ES 2
- 10. 如何停止Android上的OpenGL ES绘图背景颜色?
- 11. OpenGL ES 2.0,在改变背景时不会改变颜色
- 12. 将导航栏颜色混合到背景颜色(渐变?)
- 13. 将Windows窗体背景颜色设置为混合颜色?
- 14. 颜色在OpenGL ES中不能正确混合
- 15. OpenGL ES 2.0,与所有东西混合
- 16. div背景图像显示出来,但背景颜色不是
- 17. Seekbar只显示进度颜色而不显示背景颜色
- 18. Opengl ES混色模式
- 19. ,如何清除DC的背景颜色。所以,绘制的文本将不显示背景颜色
- 20. Android/Java:确定文本颜色是否会与背景混合?
- 21. Android OpenGL ES透明背景
- 22. OpenGL es 2.0混合问题
- 23. Alpha与OpenGL ES 2.0混合?
- 24. OpenGL ES 2.0的混合
- 25. CSS背景颜色没有显示?
- 26. 覆盖div不显示背景颜色
- 27. JFrame背景颜色不显示
- 28. 显示图像的背景颜色 - CSS
- 29. Div包装背景颜色不显示
- 30. 为什么背景颜色不显示?
谢谢,会给它一个镜头。 –