【问题标题】:OpenGl ES on iOS lightshading removes coloriOS 上的 OpenGL ES 光影去除颜色
【发布时间】:2014-02-19 23:53:58
【问题描述】:

我仍然习惯于使用着色器的 OpenGL,之前一直在使用 OGL ES 1.0,但现在是时候更新我的知识了!现在,我正在查看的简单着色器有问题,我已经连续搜索了 2 天,但没有找到解决方案。 问题是这样的:我用 VBO 以(Vx,Vy,Vz,NormalX,NormalY,NormalZ,ColorR,ColorG,ColorB,ColorA)的形式渲染一些立方体,当我在没有着色器的情况下渲染它时效果很好,但我有使用着色器进行翻译和其他东西(我知道它可以在没有但忍受我的情况下完成)。这是我的顶点着色器,默认来自 XCode 中的 OGL 模板:

attribute vec4 position;
attribute vec3 normal;
uniform vec3 translation;
varying lowp vec4 colorVarying;

uniform mat4 modelViewProjectionMatrix;
uniform mat3 normalMatrix;

void main()
{
    vec3 eyeNormal = normalize(normalMatrix * normal);
    vec3 lightPosition = vec3(0.0, 0.0, 10.0);
    vec4 diffuseColor = vec4(0.4, 0.4, 1.0, 1.0);

    float nDotVP = max(0.0, dot(eyeNormal, normalize(lightPosition)));

    colorVarying = diffuseColor * nDotVP;

    gl_Position = modelViewProjectionMatrix * (position + vec4(translation, 1));
}

还有片段着色器,也是默认的:

varying lowp vec4 colorVarying;

void main()
{
    gl_FragColor = colorVarying;
}

现在这总是渲染我用相同颜色(由diffuseColor定义)绘制的任何三角形,而不考虑VBO中的颜色。所以我尝试过使用其他片段着色器(如gl_FragColor = gl_FrontColor;)但失败了,但 gl_FrontColor/gl_Color 等不包含在 OpenGL ES 中,并且在 OpenGL 3.x 或其他内容中已弃用。我也使用纹理采样器查看过代码,但由于我没有使用纹理而是颜色,所以对于初学者来说有点复杂。

所以我的问题是,我如何让我的片段着色器找到当前被着色片段的材质颜色? 如果我应该将数组中的颜色传递给着色器,我将如何做以及如何针对当前着色片段引用它?

(一些“也”尝试不使用片段着色器,但 OGL 不允许仅使用顶点着色器。尝试简单地删除 gl_FragColor = colorVarying; 但这会使颜色真的搞砸了)

【问题讨论】:

    标签: ios opengl-es


    【解决方案1】:

    您需要在着色器中添加颜色属性:

    attribute vec4 position;
    attribute vec3 normal;
    attribute vec4 colour;
    

    ...并使用该属性而不是diffuseColor。

    您还必须使用glVertexAttribPointer 告诉 OpenGL 在您的 VBO 中哪里可以找到该顶点属性(我假设您已经为位置和法线属性这样做了)。

    【讨论】:

    • 是的,我只需要添加 glBindAttribLocation(_program, GLKVertexAttribColor, "color");和属性 vec4 颜色; int 顶点着色器 这就像一个魅力。非常感谢!
    猜你喜欢
    • 2018-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-04
    • 1970-01-01
    • 1970-01-01
    • 2014-05-10
    相关资源
    最近更新 更多