【问题标题】:OpenGL ES 2.0: Shader Linking FailOpenGL ES 2.0:着色器链接失败
【发布时间】:2015-08-20 05:26:57
【问题描述】:

我正在尝试制作一个使用 openGL 的简单 android 程序。到目前为止,着色器链接失败,日志信息是,

日志

Link info
    ---------
    OpenGL ES programs must have both a vertex and a fragment shader or a compute shader.  

着色器编译工作正常。这是着色器代码:

顶点着色器

attribute vec4 a_Position;

void main() {
    gl_Position = a_Position;
    gl_PointSize = 10.0;
}  

片段着色器
精度中等p float;

uniform vec4 u_Color;

void main()
{
    gl_FragColor = u_Color;
}  

我正在采取的步骤是,

final int programObjectId = glCreateProgram();

if(programObjectId == 0)
   return 0;

glAttachShader(programObjectId, vertexShaderId);
glAttachShader(programObjectId, fragmentShaderId);
glLinkProgram(programObjectId);

编译代码

public static int compileShader(int type, String code) {

    final int shaderObjectId = glCreateShader(type);

    glShaderSource(shaderObjectId, code);
    glCompileShader(shaderObjectId);
    int compilationStatus[] = new int[1];
    glGetShaderiv(shaderObjectId, GL_COMPILE_STATUS, compilationStatus, 0);

    if(compilationStatus[0] == 0)
        glDeleteShader(shaderObjectId);
    return shaderObjectId & compilationStatus[0];
}

我不知道如何解决这个问题。

【问题讨论】:

  • 你在哪里创建着色器/调用 glCreateShader?我猜想 vertexShaderId 不是 GL_VERTEX_SHADER 类型,或者 fragmentShaderId 不是 GL_FRAGMENT_SHADER 类型。
  • 我根据来源传入GL_VERTEX_SHADER或GL_FRAGMENT_SHADER。
  • 没关系。没有很清楚地考虑返回值。我没有返回着色器的 id,而是返回了一些垃圾。

标签: android c++ opengl-es


【解决方案1】:

问题出在compileShader的最后一行:这里你对shaderObjectId(一个任意> 0的数字)和compileStatus(GL_TRUE或GL_FALSE)进行按位和运算。由于 GL_TRUE = 1 和 GL_FALSE = 0,所以这个运算的结果只能是 0 或 1。

让我们看看 GL_TRUE 的情况,因为使用 GL_FALSE 无论如何结果都是 0。

For every even number x:
x & 1 == 1
For every odd number x:
x & 1 == 0

这意味着,如果 shaderObjectId = 3(例如),该函数将返回 1。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多