2017-07-28 122 views
0

我买了一本关于Opengl es的书。我从一开始就开始从本书中复制代码,但必须出现我找不到的错误。如果你能帮助我,那会很好。学习Opengl与“Android的OpenGL ES 2”,但代码不起作用

这里是代码:

渲染器:

import java.nio.ByteBuffer; 
import java.nio.ByteOrder; 
import java.nio.FloatBuffer; 


public class AirHockeyRenderer implements Renderer { 

private static final int POSITION_COMPONENT_COUNT = 2; 

private static final int BYTES_PER_FLOAT = 4; 
private final FloatBuffer vertexData; 

private final Context context; 

private int program; 

private static final String U_COLOR = "u_Color"; 
private int uColorLocation; 

private static final String A_POSITION = "a_Position"; 
private int aPositionLocation; 

public AirHockeyRenderer(Context context){ 

    this.context = context; 

    float[] tableVerticesWithTriangles = { 

      // Triangle1 
      0f, 0f, 
      9f, 14f, 
      0f, 14f, 

      //Triangle2 
      0f, 0f, 
      9f, 0f, 
      9f, 14f, 

      //Line1 
      0f, 7f, 
      9f, 7f, 

      //Mallets 
      4.5f, 2f, 
      4.5f, 12f 
    }; 

    vertexData = ByteBuffer 
      .allocateDirect(tableVerticesWithTriangles.length * BYTES_PER_FLOAT) 
      .order(ByteOrder.nativeOrder()) 
      .asFloatBuffer(); 

    vertexData.put(tableVerticesWithTriangles); 

} 

@Override 
public void onSurfaceCreated(GL10 glUnused, EGLConfig config){ 

    glClearColor(0.0f, 0.0f, 0.0f, 0.0f); 

    String vertexShaderSource = TextResourceReader.readTextFileFromResource(context, R.raw.simple_vertex_shader); 
    String fragmentShaderSource = TextResourceReader.readTextFileFromResource(context, R.raw.simple_fragment_shader); 

    int vertexShader = ShaderHelper.compileVertexShader(vertexShaderSource); 
    int fragmentShader = ShaderHelper.compileFragmentShader(fragmentShaderSource); 

    program = ShaderHelper.linkProgram(vertexShader, fragmentShader); 

    if (LoggerConfig.ON) 
    { 

     ShaderHelper.validateProgram(program); 

    } 

    glUseProgram(program); 

    uColorLocation = glGetUniformLocation(program, U_COLOR); 

    aPositionLocation = glGetAttribLocation(program, A_POSITION); 

    vertexData.position(0); 
    glVertexAttribPointer(aPositionLocation, POSITION_COMPONENT_COUNT, GL_FLOAT, false, 0, vertexData); 

    glEnableVertexAttribArray(aPositionLocation); 

} 

@Override 
public void onSurfaceChanged(GL10 glUnused, int width, int height) { 

    glViewport(0, 0, width, height); 

} 

@Override 
public void onDrawFrame(GL10 unused) { 

    glClear(GL_COLOR_BUFFER_BIT); 

    glUniform4f(uColorLocation, 1.0f, 1.0f, 1.0f, 1.0f); 
    glDrawArrays(GL_TRIANGLES, 0, 6); 

    glUniform4f(uColorLocation, 1.0f, 0.0f, 0.0f, 1.0f); 
    glDrawArrays(GL_LINES, 6, 2); 

    glUniform4f(uColorLocation, 0.0f, 0.0f, 1.0f, 1.0f); 
    glDrawArrays(GL_POINTS, 8, 1); 

    glUniform4f(uColorLocation, 1.0f, 0.0f, 0.0f, 1.0f); 
    glDrawArrays(GL_POINTS, 9, 1); 

} 

} 

活性:

import android.app.Activity; 
import android.opengl.GLSurfaceView; 
import android.os.Bundle; 

public class AirHockeyActivity extends Activity { 

private GLSurfaceView glSurfaceView; 
private boolean rendererSet = false; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 

    glSurfaceView = new GLSurfaceView(this); 
    glSurfaceView.setEGLContextClientVersion(2); 
    glSurfaceView.setRenderer(new AirHockeyRenderer(this)); 
    rendererSet = true; 
    setContentView(glSurfaceView); 

} 

@Override 
protected void onPause() { 

    super.onPause(); 

    if (rendererSet){ 
     glSurfaceView.onPause(); 
    } 

} 

@Override 
protected void onResume() { 

    super.onResume(); 

    if (rendererSet) { 
     glSurfaceView.onResume(); 
    } 

} 

} 

一类以接通/关断

的着色器辅助记录器的配置: private static final String TAG =“ShaderHelper”;

public static int compileVertexShader(String shaderCode) 
{ 

    return compileShader(GL_VERTEX_SHADER, shaderCode); 

} 

public static int compileFragmentShader(String shaderCode) 
{ 

    return compileShader(GL_FRAGMENT_SHADER, shaderCode); 

} 

private static int compileShader(int type, String shaderCode) 
{ 
    final int shaderObjectId = glCreateShader(type); 

     if (shaderObjectId == 0) 
     { 

      if (LoggerConfig.ON) 
      { 

       Log.w(TAG, "Could not create new shader."); 

      } 

      return 0; 

     } 

    glShaderSource(shaderObjectId, shaderCode); 

    final int[] compileStatus = new int[1]; 
    glGetShaderiv(shaderObjectId,GL_COMPILE_STATUS, compileStatus, 0); 

    if(LoggerConfig.ON) 
    { 

     Log.v(TAG, "Results of compiling source:" + "\n" + shaderCode + "\n" + glGetShaderInfoLog(shaderObjectId)); 

    } 

    if(compileStatus[0] == 0) 
    { 

     glDeleteShader(shaderObjectId); 

     if (LoggerConfig.ON) 
     { 

      Log.w(TAG, "Compilation of shader failed."); 

     } 

     return 0; 

    } 

    return shaderObjectId; 

} 

public static int linkProgram(int vertexShaderId, int fragmentShaderId) 
{ 

    final int programObjectId = glCreateProgram(); 

    if (programObjectId == 0) 
    { 

     if (LoggerConfig.ON) 
     { 

      Log.w(TAG, "Could not create new program"); 

     } 

     return 0; 

    } 

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

    glLinkProgram(programObjectId); 

    final int[] linkStatus = new int[1]; 
    glGetProgramiv(programObjectId, GL_LINK_STATUS, linkStatus, 0); 

    if (LoggerConfig.ON) 
    { 

     Log.v(TAG, "Results of linking program:\n" + glGetProgramInfoLog(programObjectId)); 

    } 

    if (linkStatus[0] == 0) 
    { 

     glDeleteProgram(programObjectId); 
     if (LoggerConfig.ON) 
     { 

      Log.w(TAG, "Linking of program failed."); 

     } 

     return 0; 

    } 

    return programObjectId; 

} 

public static boolean validateProgram(int programObjectId) 
{ 

    glValidateProgram(programObjectId); 

    final int[] validateStatus = new int[1]; 
    glGetProgramiv(programObjectId, GL_VALIDATE_STATUS, validateStatus, 0); 
    Log.v(TAG, "Results of validating program" + validateStatus[0] + "\nLog:" + glGetProgramInfoLog(programObjectId)); 

    return validateStatus[0] != 0; 

} 

} 

文本资源读取器:

package peter.aquickstartguide; 

import android.content.Context; 
import android.content.res.Resources; 

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 



public class TextResourceReader { 

public static String readTextFileFromResource(Context context, int resourceId){ 

    StringBuilder body = new StringBuilder(); 

    try { 

     InputStream inputStream = context.getResources().openRawResource(resourceId); 
     InputStreamReader inputStreamReader = new InputStreamReader(inputStream); 
     BufferedReader bufferedReader = new BufferedReader(inputStreamReader); 

     String nextLine; 

     while ((nextLine = bufferedReader.readLine()) != null){ 

      body.append(nextLine); 
      body.append('\n'); 

     } 

    } 

    catch (IOException e) { 

     throw new RuntimeException("could not open resource: " + resourceId, e); 

    } 

    catch (Resources.NotFoundException nfe) { 

     throw new RuntimeException("Resource not found: " + resourceId, nfe); 

    } 

    return body.toString(); 

} 

} 

和碎片着色器:

precision mediump float; 

uniform vec4 u_Color; 

void main() 
{ 

    gl_FragColor = u_Color; 

} 

和顶点着色器:

attribute vec4 a_Position; 

void main() 
{ 

gl_Position = a_Position; 

} 

这是日志:

07-28 20:12:44.304 11410-11410/? I/art: Late-enabling -Xcheck:jni 
07-28 20:12:44.352 11410-11410/peter.aquickstartguide W/ResourceType: Found multiple library tables, ignoring... 
07-28 20:12:44.364 11410-11410/peter.aquickstartguide I/InstantRun: Instant Run Runtime started. Android package is peter.aquickstartguide, real application class is null. 
07-28 20:12:45.035 11410-11410/peter.aquickstartguide W/art: Failed to find OatDexFile for DexFile /data/data/peter.aquickstartguide/files/instant-run/dex/slice-slice_6-classes.dex (canonical path /data/data/peter.aquickstartguide/files/instant-run/dex/slice-slice_6-classes.dex) with checksum 0xbb33533c in OatFile /data/data/peter.aquickstartguide/cache/slice-slice_6-classes.dex 
07-28 20:12:45.604 11410-11527/peter.aquickstartguide D/OpenGLRenderer: Use EGL_SWAP_BEHAVIOR_PRESERVED: true 
07-28 20:12:45.632 11410-11410/peter.aquickstartguide D/Atlas: Validating map... 
07-28 20:12:45.686 11410-11527/peter.aquickstartguide I/Adreno-EGL: <qeglDrvAPI_eglInitialize:410>: EGL 1.4 QUALCOMM build: AU_LINUX_ANDROID_LA.BF.1.1.1_RB1.05.01.00.042.030_msm8974_LA.BF.1.1.1_RB1__release_AU() 
OpenGL ES Shader Compiler Version: E031.25.03.06 
Build Date: 05/17/15 Sun 
Local Branch: mybranch10089422 
Remote Branch: quic/LA.BF.1.1.1_rb1.22 
Local Patches: NONE 
Reconstruct Branch: AU_LINUX_ANDROID_LA.BF.1.1.1_RB1.05.01.00.042.030 + 6151be1 + NOTHING 
07-28 20:12:45.692 11410-11527/peter.aquickstartguide I/OpenGLRenderer: Initialized EGL, version 1.4 
07-28 20:12:45.742 11410-11527/peter.aquickstartguide D/OpenGLRenderer: Enabling debug mode 0 
07-28 20:12:45.805 11410-11526/peter.aquickstartguide V/ShaderHelper: Results of compiling source: 

attribute vec4 a_Position; 

void main() 
{                   

gl_Position = a_Position; 

} 

07-28 20:12:45.805 11410-11526/peter.aquickstartguide W/ShaderHelper: Compilation of shader failed. 
07-28 20:12:45.805 11410-11526/peter.aquickstartguide V/ShaderHelper: Results of compiling source: 

precision mediump float; 

uniform vec4 u_Color; 

void main() 
{                   

gl_FragColor = u_Color; 

} 

07-28 20:12:45.805 11410-11526/peter.aquickstartguide W/ShaderHelper: Compilation of shader failed. 
07-28 20:12:45.805 11410-11526/peter.aquickstartguide W/Adreno-ES20: <core_glAttachShader:412>: GL_INVALID_VALUE 
07-28 20:12:45.806 11410-11526/peter.aquickstartguide V/ShaderHelper: Results of linking program: 
07-28 20:12:45.806 11410-11526/peter.aquickstartguide W/ShaderHelper: Linking of program failed. 
07-28 20:12:45.806 11410-11526/peter.aquickstartguide V/ShaderHelper: Results of validating program0 

Log: 
07-28 20:12:45.835 11410-11410/peter.aquickstartguide I/Timeline: Timeline: Activity_idle id: [email protected] time:59876851 
07-28 20:12:48.618 11410-11410/peter.aquickstartguide I/Timeline: Timeline: Activity_idle id: [email protected] time:59879635 
07-28 20:12:48.618 11410-11526/peter.aquickstartguide V/ShaderHelper: Results of compiling source: 

attribute vec4 a_Position; 

void main() 
{                 

gl_Position = a_Position; 

} 

07-28 20:12:48.618 11410-11526/peter.aquickstartguide W/ShaderHelper: Compilation of shader failed. 
07-28 20:12:48.618 11410-11526/peter.aquickstartguide V/ShaderHelper: Results of compiling source: 
precision mediump float; 

uniform vec4 u_Color; 

void main() 
{ 

gl_FragColor = u_Color; 

} 

07-28 20:12:48.618 11410-11526/peter.aquickstartguide W/ShaderHelper: Compilation of shader failed. 
07-28 20:12:48.618 11410-11526/peter.aquickstartguide W/Adreno-ES20: <core_glAttachShader:412>: GL_INVALID_VALUE 
07-28 20:12:48.618 11410-11526/peter.aquickstartguide V/ShaderHelper: Results of linking program: 
07-28 20:12:48.618 11410-11526/peter.aquickstartguide W/ShaderHelper: Linking of program failed. 
07-28 20:12:48.619 11410-11526/peter.aquickstartguide V/ShaderHelper: Results of validating program0 
Log:  

当我尝试运行此操作时,我从Android Studio中得不到任何错误。只是一个黑色(橙色,等等,这取决于颜色我选择)显示。其实在右上角应该有一个白色的方形。

回答

0

你永远不会打电话glCompileShader。将源代码放入着色器对象后,必须编译着色器。

glShaderSource(shaderObjectId, shaderCode); 
glCompileShader(shaderObjectId);