自己扩展了一个shader效果 版本3.8 lua
就是能够做一个任意位置的圆形透明 在PC上表现正常 上了安卓以后报错 可能报在任何地方 最多是在CCTexture2D的initWithMipmaps
Vsh:
ifdef GL_ES
precision mediump float;
endif
attribute vec4 a_position;
attribute vec2 a_texCoord;
attribute vec4 a_color;
varying vec4 v_fragmentColor;
varying vec2 v_texCoord;
void main()
{
gl_Position = CC_PMatrix * a_position;
v_fragmentColor = a_color;
v_texCoord = a_texCoord;
}
fsh:
ifdef GL_ES
precision mediump float;
endif
varying vec4 v_fragmentColor;
varying vec2 v_texCoord;
uniform vec2 my_higpos;
uniform vec2 my_bgsize;
uniform float my_higrad;
const float range = 0.3;
vec4 memoryRender(vec4 texColor)
{
texColor.r = 0.0;
texColor.g = 0.0;
texColor.b = 0.0;
float realx = v_texCoord.x * my_bgsize[0];
float realy = v_texCoord.y * my_bgsize[1];
vec2 despos;
despos.x = realx;
despos.y = realy;
float lenth = distance(despos,my_higpos);
if(lenth <= my_higrad)
{
if(lenth >= my_higrad * range && lenth <= my_higrad)
{
texColor.a = 0.7 * (lenth - my_higrad * range) / (my_higrad * (1.0 - range));
}
else
{
texColor.a = 0.0;
}
}
else
{
texColor.a = 0.7;
}
return texColor;
}
void main(void)
{
vec4 texColor = texture2D(CC_Texture0, v_texCoord);
texColor = memoryRender(texColor);
gl_FragColor = texColor;
}
lua创建代码
local CenterPos = self.tower.bgBtn:getParent():convertToWorldSpace(cc.p(self.tower.bgBtn:getPosition()))
local CenterSize = self.tower.bgBtn:getContentSize()
CenterPos.y = display.height - CenterPos.y
local baselayer = self.widget:getChildByName(“baselayer”)
local TestBg = cc.Sprite:create("Bg/loginScene.png")
TestBg:setPosition(cc.p(1366 / 2,768 / 2))
baselayer:addChild(TestBg)
local gl_Program = cc.GLProgram:create("shader/shader_SpriteMisty.vsh","shader/shader_SpriteMisty.fsh")
gl_Program:bindAttribLocation(cc.ATTRIBUTE_NAME_POSITION,cc.VERTEX_ATTRIB_POSITION)
gl_Program:bindAttribLocation(cc.ATTRIBUTE_NAME_COLOR,cc.VERTEX_ATTRIB_COLOR)
gl_Program:bindAttribLocation(cc.ATTRIBUTE_NAME_TEX_COORD,cc.VERTEX_ATTRIB_FLAG_TEX_COORDS)
gl_Program:link()
gl_Program:updateUniforms()
local RLenth = math.sqrt( math.pow(CenterSize.width / 2,2) + math.pow(CenterSize.height / 2,2))
gl_ProgramState = cc.GLProgramState:getOrCreateWithGLProgram(gl_Program)
gl_ProgramState:setUniformFloat("my_higrad",RLenth)
gl_ProgramState:setUniformVec2("my_higpos",CenterPos)
gl_ProgramState:setUniformVec2("my_bgsize",cc.p(display.width,display.height))
TestBg:setGLProgramState(gl_ProgramState)
安卓logcat报错
1602.322: D/cocos2d-x debug info(7672): OpenGL error 0x0502 in D:\svn\sg_cocos2\frameworks\runtime-src\proj.android…/…/cocos2d-x/cocos//./renderer/CCTexture2D.cpp initWithMipmaps 647
1602.604: W/Adreno-ES20(7672): <core_glGetUniformLocation:2070>: GL_INVALID_OPERATION