iOS lightshading上的OpenGl ES删除颜色

iOS lightshading上的OpenGl ES删除颜色,ios,opengl-es,Ios,Opengl Es,我仍然习惯OpenGL和着色器,以前使用过OGLES1.0,但现在是时候更新我的知识了!现在我有一个简单的着色器问题,我正在寻找,我已经连续搜索了2天没有解决方案的运气。 问题是:我用VBO以(Vx、Vy、Vz、NormalX、NormalY、NormalZ、ColorR、ColorG、ColorB、ColorA)的形式渲染一些立方体,当我在不使用着色器的情况下渲染立方体时,效果很好,但我必须使用着色器进行翻译和其他操作(我知道这可以不用,但请耐心)。这是我的顶点着色器,默认来自XCode中的O

我仍然习惯OpenGL和着色器,以前使用过OGLES1.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或其他版本中被弃用。我也看过使用纹理采样器的代码,但因为我不使用纹理,而是使用颜色,所以对于初学者来说有点复杂

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


(也有一些;尝试不使用片段着色器,但OGL不允许仅使用顶点着色器。尝试简单地删除gl_FragColor=colorvaring;但这会使颜色变得非常糟糕)

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

attribute vec4 position;
attribute vec3 normal;
attribute vec4 colour;
…并使用该属性而不是
diffuseColor


您还必须使用
glvertexattributepointer
告诉OpenGL在VBO中的何处查找顶点属性(我假设您已经对位置和法线属性这样做了)

是的,我只需要添加glbindAttriblation(_程序,glkVertexAttribleColor,“color”);和属性vec4颜色;对顶点着色器进行整型,这就像一个符咒。非常感谢你!