2016-07-13 3 views
0

OpenGL을 사용하여 간단한 안드로이드 게임을 만들려고하고 있습니다. s7 및 Nexus 5 에뮬레이터에서 응용 프로그램을 빌드하고 실행할 수 있었지만 s6에서 실행하려고 시도했지만 실패했습니다.S6 셰이더를 만들 때 안드로이드 OpenGL 컴파일이 실패했습니다

셰이더가 컴파일에 실패한 것처럼 보였습니다. 나는이 문제를 일으키는 것이 확실하지 않습니다. 나는 여러 가지 작은 것들로 보았지만 아무런 운이 없었습니다. 나는 분명 무언가를 놓쳐 버린 것 같아. 다른 답변을 읽었지만 이미 다른 기기에서 작동하는 게임에는 적용되지 않습니다. 아래는 쉐이더 코드와 간단한 OpenGL 함수입니다.

public Shader(String data, int kind) throws IllegalArgumentException { 
    this.kind = kind; 
    shader = GLES20.glCreateShader(kind); 
    GLES20.glShaderSource(shader, data); 
    GLES20.glCompileShader(shader); 

    int[] compiled = new int[1]; 
    GLES20.glGetShaderiv(shader, GLES20.GL_COMPILE_STATUS, compiled, 0); 
    if (compiled[0] == GLES20.GL_FALSE) { 
     String log = GLES20.glGetShaderInfoLog(shader); 
     dispose(); 
     throw new IllegalArgumentException("Shader compilation error: " + log); 
    } 
} 

다음은 음영 처리를위한 openGL 기능입니다.

public static final String VERT_SHADER = 
    "#version 100\n" + 

    "uniform float surfaceRatio;\n" + 
    "attribute vec2 position;\n" + 

    "void main() {\n" + 
    " gl_Position = vec4(position.x * surfaceRatio, position.y, 0.0f, 1.0f);\n" + 
    "}\n"; 

// The fragment shader code. 
public static final String FRAG_SHADER = 
    "#version 100\n" + 

    "uniform vec3 color;\n" + 

    "void main() {\n" + 
    " gl_FragColor = vec4(color, 1.0f);\n" + 
    "}\n"; 

이러한 크로스 플랫폼 문제가 발생할 수있는 명백한 오류가 있다면 알려주십시오. 필요에 따라 더 많은 코드 또는 정보를 제공 할 수 있습니다.

답변

0

GLSL ES 1.00에서 부동 소수점 상수 구문이 유효하지 않습니다. f 접미사는 허용 된 구문의 일부가 아닙니다. 따라서 쉐이더 코드에 0.0f이있는 경우 0.0으로 바꾸고 1.0f이있는 곳은 이되어야합니다.

일부 공급 업체의 GLSL 컴파일러 (이름이없는 ...)는 비교적 관대 한 경향이 있으며 이러한 종류의 오류가있는 쉐이더를 불만없이 컴파일합니다. 다른 공급 업체의 컴파일러는 호환되지 않는 코드의 오류를보고하는 데 더 엄격합니다.

f 접미사는 GLSL ES 3.00 이상에서 사용할 수 있습니다.

예를 들어 1.0double의 상수 인 C/C++와 달리 GLSL에서 float 유형의 상수임을 이해해야합니다. 나중에 GLSL 버전은 f 접미사를 허용하지만, 상수의 유형을 변경하지 않기 때문에 함수가 전혀 없습니다.

GLSL ES 버전 (현재 3.2까지)은 이중 값을 지원하지 않습니다. 전체 OpenGL 4.x 만 셰이더에서 배정도 산술 연산을 지원합니다. OpenGL 4.x에서는또는 LF의 접미사가 double 유형의 상수에 필요합니다. 접미사가없는 상수는 여전히 float입니다.

+0

나는 이것을 이전에 시도해 본 다음 오류가 쉐이더에서 색상 변수 주위를 돌았습니다. 거기에 문제가 발생할 가능성이 있습니까? 나중에 특정 오류 텍스트를 제공 할 수 있습니다. 나는 현재 내 터미널에서 떨어져있다. 당신의 도움을 주셔서 감사합니다. 이것은 매우 유익했다. – Runner5