Ios 如何获得一个;“发光”;OpenGL ES 2.0中的着色器效果?

Ios 如何获得一个;“发光”;OpenGL ES 2.0中的着色器效果?,ios,opengl-es,glsl,opengl-es-2.0,shader,Ios,Opengl Es,Glsl,Opengl Es 2.0,Shader,我正在为iOS编写一个3D应用程序。我是OpenGLES2.0新手,所以我仍然在编写基本着色器。 我真的需要在我的一些模型上实现基于纹理的“发光”效果 以下是一个示例: 我正在寻找OpenGLES2.0的代码示例。我在互联网上找到的大多数代码都是针对桌面OpenGL或D3D的 有什么想法吗?该网站有一系列着色器示例 您应该能够修改这些以从纹理中提取uv 这是 \ifdef glu 精密中泵浮子; #恩迪夫 #扩展GL_OES_标准_衍生工具:启用 均匀浮动时间; 均匀vec2小鼠; 均匀vec

我正在为iOS编写一个3D应用程序。我是OpenGLES2.0新手,所以我仍然在编写基本着色器。 我真的需要在我的一些模型上实现基于纹理的“发光”效果

以下是一个示例:

我正在寻找OpenGLES2.0的代码示例。我在互联网上找到的大多数代码都是针对桌面OpenGL或D3D的

有什么想法吗?

该网站有一系列着色器示例

您应该能够修改这些以从纹理中提取uv

这是

\ifdef glu
精密中泵浮子;
#恩迪夫
#扩展GL_OES_标准_衍生工具:启用
均匀浮动时间;
均匀vec2小鼠;
均匀vec2分辨率;
真空总管(真空){
vec2p=(gl_FragCoord.xy*2.0-分辨率)/min(分辨率x,分辨率y);
vec3-color1=vec3(0.0,0.3,0.5);
vec3-color2=vec3(0.5,0.0,0.3);
浮动f=0.0;
浮点数g=0.0;
浮动h=0.0;
浮点数PI=3.14159265;
对于(浮点i=0.0;i<40.0;i++){
如果(地板(鼠标x*41.0)
首先,有大量的算法和技术可以产生发光效果。 我只想提出一种可能性

创建发光的材质。 为此,我使用了一个修改的灯光模型,其中光源的方向始终是片段法向量的反方向

可变vec3垂直位置;
可变vec3-vertNV;
可变vec3-vertCol;
均匀浮动u_辉光;
void main()
{
vec3颜色=vertCol;
浮光度=10.0;
vec3 normalV=正常化(vertNV);
vec3-eyeV=标准化(-vertPos);
vec3-halfV=规格化(eyeV+normalV);
浮点NdotH=最大值(0.0,点(法线V,半V));
浮动发光系数=(光泽度+2.0)*功率(光泽度,光泽度)/(2.0*3.14159265);
gl_-FragColor=vec4(u_-glow*(0.1+color.rgb*glowFac*0.5),1.0);
}
在第二步骤中,对输出执行高斯模糊算法。将场景写入帧缓冲区,并将纹理绑定到颜色平面。屏幕空间过程使用纹理作为输入来模糊输出。
出于性能原因,模糊算法首先沿视口的X轴执行,然后再沿视口的Y轴执行

可变vec2垂直位置;
均匀取样器2D u_textureCol;
均匀的vec2 u_纹理;
均匀浮动u_σ;
均匀的内部宽度;
浮点计算器(浮点x,浮点西格玛)
{
浮动系数=1.0/(2.0*3.14157*西格玛);
浮点指数=-(x*x)/(2.0*sigma);
收益率(系数*exp(指数));
}
void main()
{
vec2 texC=vertPos.st*0.5+0.5;
vec4 texCol=纹理(u_textureCol,texC);
vec4高斯科尔=vec4(texCol.rgb,1.0);
vec2步长=1.0/u_纹理化;

对于(int i=1;i着色器效果在opengl ES 2.0和桌面opengl之间差别很小。如果你找到一个很好的教程来做你想做的,移植它应该很简单。感谢你的安慰,这是另一件困扰我的事情。一些(通常是旧的)示例使用输入/输出变量,这在ES文档中似乎找不到。我会继续挖掘,但任何好的示例通常都是我在研究和理解如何使用GLSL方面的一个飞跃。有人为此获得过Android代码吗?O'Reilly的书《iPhone 3D编程》(iPhone 3D Programming)中有一个聪明的实现:@MateuszStawecki您最终实现了辉光效果吗?谢谢您的回答,但是为什么顶点着色器中的这一行“vertPos=pos.xyz/pos.w;”需要除以w吗?我认为在这个阶段w总是1。@wdanxna不,在这种情况下不需要。@rabbi76是您代码中的第一个着色器,它是片段代码吗着色器。@Summit有一个输入错误
fragColor
必须是
gl\u fragColor
。答案底部示例中的代码是正确的。
#ifdef GL_ES
precision mediump float;
#endif

#extension GL_OES_standard_derivatives : enable

uniform float time;
uniform vec2 mouse;
uniform vec2 resolution;

void main(void){

    vec2 p = (gl_FragCoord.xy * 2.0 - resolution) / min(resolution.x, resolution.y);
    vec3 color1 = vec3(0.0, 0.3, 0.5);
    vec3 color2 = vec3(0.5, 0.0, 0.3);

    float f = 0.0;
    float g = 0.0;
    float h = 0.0;
    float PI = 3.14159265;
    for(float i = 0.0; i < 40.0; i++){
        if (floor(mouse.x * 41.0) < i)
            break;
        float s = sin(time + i * PI / 20.0) * 0.8;
        float c = cos(time + i * PI / 20.0) * 0.8;
        float d = abs(p.x + c);
        float e = abs(p.y + s);
        f += 0.001 / d;
        g += 0.001 / e;
        h += 0.00003 / (d * e);
    }


    gl_FragColor = vec4(f * color1 + g * color2 + vec3(h), 1.0);
}