2015-08-19 3 views
1

Я пытаюсь создать простую программу для Android, которая использует openGL. До сих пор, шейдер сшивание терпит неудачу, и информация журнала естьOpenGL ES 2.0: Shader Linking Fail

LOG

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

Шейдер сборник работает отлично. Вот код шейдера:

Vertex Shader

attribute vec4 a_Position; 

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

Фрагмент Shader
точность mediump поплавок;

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]; 
} 

Я не знаю, как решить эту проблему.

+0

Где вы создаете шейдеры/звоните glCreateShader? Я бы предположил, что либо vertexShaderId не имеет тип GL_VERTEX_SHADER, либо фрагментShaderId не имеет тип GL_FRAGMENT_SHADER. – BDL

+0

Я перехожу в GL_VERTEX_SHADER или GL_FRAGMENT_SHADER на основе источника. – brainfreak

+0

Nevermind. Не очень хорошо думал о возвращаемых значениях. Вместо того, чтобы возвращать идентификатор шейдера, я возвращаю некоторый барахло. – brainfreak

ответ

1

Проблема заключается в последней строке compileShader: Здесь вы выполняете побитовое и операцию на shaderObjectId (произвольное число> 0) и compilationStatus (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.

Смежные вопросы