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))))