• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            黎明的剔透里伸出了你沁清的曖昧

            Graphics|EngineDev|GameDev|2D&3D Art

              C++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
              60 隨筆 :: 1 文章 :: 18 評論 :: 0 Trackbacks

            In OpenGL ES 2.0 glAlphaFunc isn't available, you have to implement it in a fragment shader. There isn't a lot of reference out there for this (not that I could find anyway) so I thought I'd write this up.

            It's actually quite simple to implement a quick alpha test. I needed to be able to cookie cut out sprites and fonts so I simply needed to reject fragments where the alpha value was zero. Here are the guts of a shader to do this:

            #ifdef GL_ES 
            precision highp float;
            #endif 
            uniform sampler2D u_tex0; 
            uniform bool u_alphatestenable; 
            varying vec2 v_texCoord;
            varying vec4 v_color;
            void main(){ 
                //calculate the fragment color based on the texture and the vertex colour
                vec4 basecolor = texture2D( u_tex0, v_texCoord ) * v_color;
            
                //if testing is enabled, check the alpha component and discard if zero      
                if(u_alphatestenable){ 
                    if(basecolor.a == 0.0){ 
                        //throw this fragment away
                        discard;
                    }
                }
                gl_FragColor = basecolor;
            }

             

            You need to set up a uniform variable u_alphatestenable which enables the alpha test. If you want to support different test types ( less than, greater than etc) then you will need two more uniform variables: one for the test type and one for the value to test against.

            int uni_alphatest_enable = glGetUniformLocation(mProgram, "u_alphatestenable"); 
            bool alphateston = true; 
            glUniform1i(uni_alphatest_enabl

             

            note that you shouldn't call glGetUniformLocation every frame, it should be cached somewhere.
            It's quite simple and while you may be thinking oh that is so slow it not that bad. It's faster then the fixed function pipeline which is doing tests for alpha, lights, blend modes etc. If you get paranoid then you can create multiple shaders that support different subsets of features. All you need to be careful of is the cost of calling glSetProgram (to switch shaders) which can be expensive and cause bubbles in the vertex pipeline in the hardware.

            posted on 2012-11-19 22:28 情絕格調(diào)(fresmaster) 閱讀(1571) 評論(0)  編輯 收藏 引用 所屬分類: GraphicsCodingDocuments
            亚洲伊人久久大香线蕉综合图片| 国产亚洲综合久久系列| 久久久久亚洲爆乳少妇无| 怡红院日本一道日本久久 | 成人综合久久精品色婷婷| 亚洲午夜久久久| 国产69精品久久久久777| 色天使久久综合网天天 | 美女写真久久影院| 久久久久亚洲av成人无码电影| 亚洲精品午夜国产VA久久成人| 亚洲一区中文字幕久久| 无码国内精品久久人妻| 久久久久一本毛久久久| 久久精品国内一区二区三区| 亚洲欧洲精品成人久久奇米网| 国产精品无码久久久久久| 亚洲国产精品无码久久青草| 久久免费精品视频| 亚洲欧洲日产国码无码久久99| 国内精品久久久久久不卡影院| 亚洲精品蜜桃久久久久久| 久久综合九色欧美综合狠狠 | 亚洲欧美日韩久久精品| 久久综合九色综合欧美狠狠| 人妻少妇久久中文字幕| 国产精品久久久久久久久久影院| 国产L精品国产亚洲区久久| AV狠狠色丁香婷婷综合久久| 色诱久久久久综合网ywww| 久久久亚洲欧洲日产国码是AV| 久久久精品久久久久特色影视| 91精品国产综合久久香蕉| 久久777国产线看观看精品| 久久发布国产伦子伦精品| 亚洲国产精品久久电影欧美 | 77777亚洲午夜久久多喷| 性高湖久久久久久久久| 99精品国产99久久久久久97| 亚洲色大成网站www久久九| 狠狠色丁香久久婷婷综合五月|