2011-01-31 22 views
14

Android uygulamasında köşe veya piksel gölgelendiricileri kullanmak mümkün mü? Lütfen gölgelendiriciyi ayarlamak için bir örnek verin.Android için Shader OpenGL ES

+6

@Vincent: Burada

bir shaderı yüklemek için nasıl bir kod örneğidir. O zamanlar, Google'da bile pek fazla bilgi yoktu. Ancak bu soru bir soru değil ve barajın cevabı çok oy aldı. Daha az dağınık olmalı ve bağlantı kurmamanız gerekir çünkü cevabın, Damian'ın cevabı gibi açıklayıcı bilgilerden oluşması gerekir. Bu yüzden puanları –

+0

aldı, evet haklısınız. – Vincent

cevap

34

2.x/OpengL ES 2'yi hedefliyorsanız, o zaman evet, mümkün. Sorunun tarihe bak burada yazmadan önce,

public int createProgram(String vertexSource, String fragmentSource) { 
    int vertexShader = loadShader(GLES20.GL_VERTEX_SHADER, vertexSource); 
    int pixelShader = loadShader(GLES20.GL_FRAGMENT_SHADER, fragmentSource); 

    int program = GLES20.glCreateProgram(); 
    if (program != 0) { 
     GLES20.glAttachShader(program, vertexShader); 
     checkGlError("glAttachShader"); 
     GLES20.glAttachShader(program, pixelShader); 
     checkGlError("glAttachShader"); 
     GLES20.glLinkProgram(program); 
     int[] linkStatus = new int[1]; 
     GLES20.glGetProgramiv(program, GLES20.GL_LINK_STATUS, linkStatus, 0); 
     if (linkStatus[0] != GLES20.GL_TRUE) { 
      Log.e(TAG, "Could not link program: "); 
      Log.e(TAG, GLES20.glGetProgramInfoLog(program)); 
      GLES20.glDeleteProgram(program); 
      program = 0; 
     } 
    } 
    return program; 
} 

private int loadShader(int shaderType, String source) { 
    int shader = GLES20.glCreateShader(shaderType); 
     if (shader != 0) { 
      GLES20.glShaderSource(shader, source); 
      GLES20.glCompileShader(shader); 
      int[] compiled = new int[1]; 
      GLES20.glGetShaderiv(shader, GLES20.GL_COMPILE_STATUS, compiled, 0); 
      if (compiled[0] == 0) { 
       Log.e(TAG, "Could not compile shader " + shaderType + ":"); 
       Log.e(TAG, GLES20.glGetShaderInfoLog(shader)); 
       GLES20.glDeleteShader(shader); 
       shader = 0; 
      } 
     } 
     return shader; 
} 
İlgili konular