【发布时间】: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; 但这会使颜色真的搞砸了)
【问题讨论】: