Неверный фрагмент шейдера. Ссылка не может быть продолжена - PullRequest
1 голос
/ 19 ноября 2011

В начале моего проекта я использовал простые String s для заполнения моих обоих Shader s кодом. Это выглядело так:

    public final static String chunkDefaultVertexInit = ""
    +constantParameters
    +"precision mediump float;"

    +"uniform mat4 mPMatrix;"
    +"uniform mat4 mVMatrix;"
    +"uniform mat4 mMMatrix;"
    +"uniform mat4 mMVMatrix;"

    +"attribute vec4 Vertex;"
    +"attribute vec3 Normal;"
    +"attribute vec2 TexCoord;"

    +"varying vec3 normal;"
    +"varying vec2 uv;"
    +"varying vec4 positionM;"
    +"varying vec4 positionMV;";
    etc....

Это сработало для меня, но было не совсем ясно. Поэтому я подумал о том, как сделать свой код немного более понятным и понятным для всех. Моя идея состояла в том, чтобы поместить всю мою связку кода в настоящий .cc -файл и переместить его в папку res / raw. Сказано - сделано. Я хотел прочитать мой код через Inputstreams и сохранить его в строку. Это также сработало, и я поставил шейдеру источник String.

Итак ... теперь возникла проблема, и, как я уже сказал, я ее еще не понял. Я даже немного рассердился на себя, потому что думал о простом способе исправить это и не вижу этого.

Я даже показал свой исходный код, который я вставил ... но он выглядит правильно! o.o

Log.i("Llama3D Shader",shaderCode);

(не беспокойтесь о странном «идентификаторе отладки», это название проекта)

Вот исходный код для шейдеров:

Vertexshader:

//vertexshader
precision mediump float;

uniform mat4 mPMatrix;
uniform mat4 mVMatrix;
uniform mat4 mMMatrix;
uniform mat4 mMVMatrix;

attribute vec4 aVertex;
attribute vec3 aNormal;
attribute vec2 aTexCoord;

varying vec2 vecTexCoord;
varying vec3 vecNormal;
varying vec4 vecVertex[2];

void main() {
    gl_Position = mPMatrix * mMVMatrix * aVertex;
    vecVertex[0] = mMMatrix * aVertex;
    vecVertex[1] = mMVMatrix * aVertex;
    vecTexCoord = aTexCoord;
    vecNormal = normalize(vec3(mMMatrix * -vec4(aNormal,0.0)));
}

Fragmentshader:

#define MAX_POINT_LIGHTS 4
precision mediump float;

varying vec2 vecTexCoord;
varying vec3 vecNormal;
varying vec4 vecVertex[2];

uniform vec3 uVecEye;
uniform vec3 uPointLightPosition[MAX_POINT_LIGHTS];
uniform vec3 uPointLightColor[MAX_POINT_LIGHTS];
uniform sampler2D textureHandle;

vec3 V = normalize(uVecEye.xyz-vecVertex[1].xyz);
vec3 N = vNormal;

vec3 vecLight[MAX_POINT_LIGHTS];
vec4 pointDiffuse  = vec4(0.0);
vec4 pointSpecular = vec4(0.0);

vec4 ambient = vec4(0.2,0.2,0.2,1.0);
vec4 color = vec4(1.0,1.0,1.0,1.0);
vec4 matSpec = vec4(1.0,1.0,1.0,1.0);
vec4 lightSpec = vec4(1.0,1.0,1.0,1.0);
vec4 spec = matSpec * lightSpec;

float shininess = 20.0;

void main() {
    for (int i=0;i<MAX_POINT_LIGHTS;i++) {

        vecLight[i].xyz = vecVertex[0].xyz - uPointLightPosition[i].xyz;
        float vecDistance = length(vecLight[i].xyz);

        if (vecDistance<=25.0) {

            vecDistance = 1.0 - max(0.0,vecDistance)/25.0;
            vec3 L = normalize(vecLight[i]);
            vec3 R = normalize(reflect(L,N));
            float LND = max(0.0,dot(N,L)) * vecDistance;

            pointDiffuse += color * vec4(uPointLightColor[i].xyz,0.0) * LND;

            if (shininess!=0.0 && spec!=0.0) {
                pointSpecular += spec * pow(max(0.0,dot(R,V)),shininess) * LND;
            } else {
                pointSpecular += vec4(0.0,0.0,0.0,0.0);
            }
        }
    }
    vec4 colorTexture = texture2D(textureHandle,vec2(+vTexCoord.x,-vTexCoord.y));
    gl_FragColor = ambient + colorTexture * pointDiffuse + pointSpecular;
}

Каждый раз, когда я пытаюсь запустить программу, ShaderlogInfo и ProgramlogInfo говорят мне:

Неверный фрагмент шейдера. Ссылка не может быть продолжена. *

Я сумасшедший или просто слепой ?! Я надеюсь, что вы знаете ответ ... Я действительно не знаю ни одного ... Пожалуйста, помогите мне!

1 Ответ

4 голосов
/ 28 августа 2012

Журнал, который вы получили, находится на этапе связывания программы glGetProgramInfoLog.

Для отладки необходим журнал Fragment Shader, glGetShaderInfoLog.

Что-то в этом роде:

def _compile(self, source):
    ptr = cast(c_char_p(source), POINTER(c_char))
    glShaderSource(self.id, 1, byref(ptr), None)
    glCompileShader(self.id)
    status = c_int(0)
    glGetShaderiv(self.id, GL_COMPILE_STATUS, byref(status))
    log = self.check()
    print(log),
    if not status.value:
        raise Exception(log)

def check(self):
    length = c_int(0)
    glGetShaderiv(self.id, GL_INFO_LOG_LENGTH, byref(length))
    log = create_string_buffer(length.value)
    glGetShaderInfoLog(self.id, length.value, None, log)
    return log.value

Хотя это не в java, а в python, оно должно дать вам представление о том, как получить журнал компиляции вашего шейдера.

Компиляция ваших шейдеров в моей среде дает мне этот журнал, который может или не может быть полезен для вас:

Vertex shader was successfully compiled to run on hardware.
WARNING: 0:2: warning(#260) Keyword 'precision' is supported in GLSL 1.3 
Fragment shader failed to compile with the following errors:
WARNING: 0:2: warning(#260) Keyword 'precision' is supported in GLSL 1.3
ERROR: 0:14: error(#143) Undeclared identifier vNormal
WARNING: 0:14: warning(#402) Implicit truncation of vector from size 1 to size 3. 
ERROR: 0:50: error(#143) Undeclared identifier vTexCoord
ERROR: 0:50: error(#216) Vector field selection out of range 'y'
ERROR: error(#273) 4 compilation errors.  No code generated
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...