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