OpenGL ES裁剪与测试

1、裁剪测试

GLES20.glEnable(GL10.GL_SCISSOR_TEST);//启用裁剪测试

GLES20.glScissor(0, 0, 100, 200);//设置区域,0,0表示裁剪区域左下角的x、y坐标,后两个参数为裁剪区域的宽度和高度

GLES20.glDisable(GL10.GL_SCISSOR_TEST);//禁用裁剪测试

2、Alpha测试

当绘制一个片元时,首先检测其Alpha值,若Alpha值符合要求,则通过测试,否则丢弃此片元,补进行绘制

glsl代码

vec4 bcolor = texture2D(sTexture, vTextureCoord);//给此片元从纹理中采样出颜色值

if(bcolor.a < 0.6) {

        discard;

} else {

        gl_FragColor = bcolor;

}

3、模板测试

GLES20.glClear(GLES20.GL_STENCIL_BUFFER_BIT);

GLES20.glEnable(GLEs20.GL_STENCIL_TEST);//允许模板测试

GLES20.glStencilFunc(GLES20.GL_ALWAYS, 1, 1);//设置模板测试参数

GLES20.glStencilOp(GLES20.GL_KEEP, GLES20.GL_KEEP, GLES20.GL_KEEP);//设置模板测试后的操作

texRect.drawSelf(textureFloor);//绘制反射面地板

GLES20.glStencilFunc(GLES20.GL_EQUAL, 1, 1);//设置模板测试参数

GLES20.glStencilOp(GLES20.GL_KEEP, GLES20.GL_KEEP, GLES20.GL_KEEP);//设置模板测试后的操作

bfd.drawSelfMirror(textureBallId);//绘制镜像

GLES20.glDisable(GLES20.GL_STRNCIL_TEST);//禁用模板测试

4、任意平面裁剪

1)给出用于定义裁剪平面的4个参数A、B、C、D,这四个参数分别是平面解析(Ax+By+Cz+D)中的4个系数

float e[] = {1, countE - 1, -countE+1, 0};定义裁剪平面

2)将裁剪平面的4个参数传入渲染管线,以备着色器使用

//获取程序中剪裁平面引用
    muClipHandle=GLES20.glGetUniformLocation(mProgram, "u_clipPlane"); 
    //将剪裁平面传入shader程序   
    GLES20.glUniform4fv(muClipHandle, 1, fromArrayToBuff(clipPane));
    
    public FloatBuffer fromArrayToBuff(float[] a)
    {
        ByteBuffer llbb = ByteBuffer.allocateDirect(a.length*4);
        llbb.order(ByteOrder.nativeOrder());//设置字节顺序
        FloatBuffer result=llbb.asFloatBuffer();
        result.put(a);
        result.position(0);  
        return result;
    }

3)在定点着色器中判断定点是否在平面的某一侧,具体方法为:将顶点位置(x0, y0, z0)带入平面方程式Ax + By + Cz + D = 0,完成计算后将得到的值传入片元着色器

//将顶点位置(x0,y0,z0)代入平面方程Ax+By+Cz+D=0,
   //若Ax0+By0+Cz0+D>0,则顶点在平面的上侧,反之在平面的下侧
   u_clipDist = dot(aPosition.xyz, u_clipPlane.xyz) +u_clipPlane.w;

4)片元着色器中根据接收到的Ax + By + Cz + D表达式的值与0之间的关系就可以得出定点裁剪平面之间的位置关系,以决定是否丢弃片元

if(u_clipDist < 0.0) discard;

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值