0
Openglに関する書籍を購入しました。私は始めから始まって本のコードをコピーしましたが、私が見つけられない間違いがなければなりません。あなたが私を助けることができればいいと思う。"OpenGL ES 2 for Android"でOpenGLを学習していますが、コードは機能しません
レンダラ:
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();
}
}
}
クラス/オフ
にシェーダーヘルパーをロガーの設定を切り替えることがここで
はコードです: プライベート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からエラーは表示されません。色はちょうど黒(オレンジ色など、選択した色に応じて)表示されます。実際には、右上隅に白い四角が表示されます。