Opengl es openGL纹理掩蔽
我试图用一系列其他图像填充一个圆圈,并用圆圈遮住这些图像。我知道为什么这不起作用,但我想不出一个解决办法来解决它 我的绘图代码(使用处理)如下所示:Opengl es openGL纹理掩蔽,opengl-es,processing,Opengl Es,Processing,我试图用一系列其他图像填充一个圆圈,并用圆圈遮住这些图像。我知道为什么这不起作用,但我想不出一个解决办法来解决它 我的绘图代码(使用处理)如下所示: PGraphicsOpenGL pgl=(PGraphicsOpenGL)g;//g可能会改变 //这解决了重叠问题 gl.glDisable(gl.gl\U深度\U测试); //打开混合模式 glEnable德国劳埃德船级社(德国劳埃德船级社); //定义混合模式 gl.glBlendFunc(gl.gl_SRC_ALPHA,gl.gl_ONE_
PGraphicsOpenGL pgl=(PGraphicsOpenGL)g;//g可能会改变
//这解决了重叠问题
gl.glDisable(gl.gl\U深度\U测试);
//打开混合模式
glEnable德国劳埃德船级社(德国劳埃德船级社);
//定义混合模式
gl.glBlendFunc(gl.gl_SRC_ALPHA,gl.gl_ONE_减去SRC_ALPHA);
//勾勒背景
填充(200200);
矩形(0,0,宽度,高度);
//切掉圆圈
gl.glBlendFunc(gl.gl\u零,gl.gl\u一减去SRC\uα);
色调(0,0,0255);
图像(圆,0,0);
//画圆圈
gl.glBlendFunc(gl.gl_ONE减去DST_ALPHA,gl.gl_ONE);
色调(140,0,0255);
图像(圆形,0,100);
gl.glBlendFunc(gl.gl_ONE减去DST_ALPHA,gl.gl_ONE);
色调(140,0140255);
图像(圆,0,0);
我一直遵循的方向似乎描述了我想要的效果。我也曾在iphone上尝试过类似的结果
以下是我期望发生的事情,以及发生的事情:
我无法真正帮助您处理混合代码,但我有另一个建议,可以简化您的绘图逻辑 我用过模具缓冲区来做类似的事情。我想画一个带有线性光栅纹理的圆盘。我不想麻烦处理纹理坐标,因为一个重要的功能是能够准确地跨过光栅的相位 我画了一个大长方形的纹理,然后在模板上画了一个白色的圆盘
(let((cnt 0d0))
(方法显示((w窗口))
复数z表示振幅和方向
光栅常数的计算
;r和psi处理后焦平面中的不同点
;r=0将导致z=w0。系统对齐以照亮
;z=w0时后焦平面的中心。
(设*((w0(*540d0(exp)(复数0d0(/pi 4d0щщ)))
(r 260d0)
(psi 270d0)
(w(*r(exp(复合物0d0(*psi(/pi 180d0щщщ)))
(z(+w w0)))
(清除模具0)
(清除:颜色缓冲位:模具缓冲位)
(负载标识)
;; http://www.swiftless.com/tutorials/
;opengl/basic_reflection.html
使用模具缓冲区从光栅中切出一个磁盘
(颜色遮罩:假:假:假:假)
(深度遮罩:假)
(启用:模具测试)
(模具功能:始终为1#xfffffff)
(模具操作:更换:更换:更换)
(绘制盘100d0(*.5d0 1920)(*.5d0 1080))
在549365摄像机上居中
;lcos上的400像素=摄像头上的276像素(带装箱2)
(颜色遮罩:真:真:真:真)
(深度遮罩:假)
(模具功能:等于1#xfffffff)
(模板操作:保留:保留:保留)
画格栅
(禁用:深度测试)
(带推送矩阵)
(翻译(*.5 1920)(*.5 1080)0)
(旋转(*(相位z)180d0(/pi))0 1)
(翻译(*-.51920)(*-.51080)0)
(附图*图片*)
(禁用:模板测试)
(启用:深度测试)
(填充格栅*格栅*(abs z))
(格式t“~a~%”cnt)
(如果(
问题一定在于如何处理透明区域。您可以启用GL_ALPHA_测试
或者,如果你的图片保持简单,你可以用三角形来画
不幸的是,启用GL\U APHA\U测试似乎并没有什么不同。接下来我将尝试模板测试。您还必须确保在glAlphaFunc中使用正确的设置。非常好!你是对的,错的是glAlphaFunc。我使用的是默认值,但是通过将其设置为gl.glAlphaFunc(gl.gl_更大,0.0);它的工作或多或少与预期的一样。。。在两个圆之间的过渡区域有一些噪音,但我想我可以在一些地方弄乱绘图代码。。。也许它只适用于alpha混合完全打开或完全关闭的像素艺术。
(let ((cnt 0d0))
(defmethod display ((w window))
;; the complex number z represents amplitude and direction
;; of the grating constant
;; r and psi addresses different points in the back focal plane
;; r=0 will result in z=w0. the system is aligned to illuminate
;; the center of the back focal plane for z=w0.
(let* ((w0 (* 540d0 (exp (complex 0d0 (/ pi 4d0)))))
(r 260d0)
(psi 270d0)
(w (* r (exp (complex 0d0 (* psi (/ pi 180d0))))))
(z (+ w w0)))
(clear-stencil 0)
(clear :color-buffer-bit :stencil-buffer-bit)
(load-identity)
;; http://www.swiftless.com/tutorials/
;; opengl/basic_reflection.html
;; use stencil buffer to cut a disk out of the grating
(color-mask :false :false :false :false)
(depth-mask :false)
(enable :stencil-test)
(stencil-func :always 1 #xffffff)
(stencil-op :replace :replace :replace)
(draw-disk 100d0 (* .5d0 1920) (* .5d0 1080))
;; center on camera 549,365
;; 400 pixels on lcos = 276 pixels on camera (with binning 2)
(color-mask :true :true :true :true)
(depth-mask :false)
(stencil-func :equal 1 #xffffff)
(stencil-op :keep :keep :keep)
;; draw the grating
(disable :depth-test)
(with-pushed-matrix
(translate (* .5 1920) (* .5 1080) 0)
(rotate (* (phase z) 180d0 (/ pi)) 0 0 1)
(translate (* -.5 1920) (* -.5 1080) 0)
(draw *bild*))
(disable :stencil-test)
(enable :depth-test)
(fill-grating *grating* (abs z))
(format t "~a~%" cnt)
(if (< cnt 360d0)
(incf cnt 30d0)
(setf cnt 0d0))
(update *bild*)
(swap-buffers)
(sleep (/ 1d0)) ;; 1 frame per second
(post-redisplay))))