質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

OpenGL ES

携帯電話のような組込み機器のためにデザインされたOpenGLのサブセットです。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Q&A

解決済

2回答

2319閲覧

OpenGL ES2.0の書籍とC言語→Javaへの変換について

退会済みユーザー

退会済みユーザー

総合スコア0

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

OpenGL ES

携帯電話のような組込み機器のためにデザインされたOpenGLのサブセットです。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

0グッド

0クリップ

投稿2016/09/26 09:46

###前提・質問内容

Androidのプログラミングに興味を持って趣味でJavaを触り
手探りでまだまだ知識は浅く日々勉強しながら、調べながらも
簡単なアプリは作ってみたりもしました。

そんな時にOpenGL ESというものがあることを知って
興味を持ったので早速やってみたいと思って以下の2つの書籍を購入しました。

「マルチプラットフォームのためのOpenGL ES入門 基礎編」
「マルチプラットフォームのためのOpenGL ES入門 応用編」

上記の本はサンプルファイル(Eclipseで作られている)が付録についており
それを基にして学んでいくスタイルです。

そのサンプルプログラムを見て思ったのですが
上記の本のプログラミングはすべてC言語で記載されている上に
補助関数として筆者が作成した関数まであるそうです。

私はAndroid Studioを用いているのでEclipseを取り込んでビルドすると
エラーの無間地獄にはまってしまいエラー解決は断念しました。

となると一から作る必要があると思うのですが
私は趣味でプログラミングをしている身で
JavaしかやっていないためC言語はほとんどわかりません。

そのため「基礎編」の一番しょっぱなのサンプルである
スケルトンプログラム(初期化しただけの真っ暗な画面)からお手上げ状態です。

そこで質問としてお聞きしたいのはC言語で記載されているものを
どうやったらJavaで動かすことができるかです。

まずはスケルトンプログラムが動かないことには進まないと思うので
どうやったらC言語で書かれているものを基に
一からJavaで作ることができるのか教えていただけたらと思います。

###該当のソースコード

以下が書籍の基礎編のスケルトンプログラムに必要な
ヘッダファイルとC言語のファイルです。

「マルチプラットフォームのためのOpenGL ES入門 基礎編」より引用しました。

support.h↓

#ifndef OpenGL_ES_20_support_h #define OpenGL_ES_20_support_h #include <stdio.h> #include <stdlib.h> #include <stdbool.h> #include <assert.h> #include <string.h> #include <math.h> #ifdef __APPLE__ #ifdef __OBJC__ #define CSTR2NSSTRING(c_str) [[NSString alloc] initWithUTF8String:c_str] // Objective-C source #define __log(message) NSLog(@message) #define __logf(fmt, ...) NSLog(@fmt, __VA_ARGS__) #else // C Source #define __log(message) printf("%s\n", message) #define __logf(fmt, ...) printf(fmt "\n", __VA_ARGS__) #endif #else // ANDROID #include <android/log.h> #define __LOG_TAG "GLES20" #define __log(msg) __android_log_print(ANDROID_LOG_DEBUG, __LOG_TAG, "%s", msg) #define __logf(...) __android_log_print(ANDROID_LOG_DEBUG, __LOG_TAG, __VA_ARGS__) #endif /** * アプリを強制停止させる(対応してないextension解説等) */ #define GLAPP_FLAG_ABORT (0x1 << 2) struct GLApplication; /** * アプリの初期化を行う */ typedef void (*GLApplication_initialize)(struct GLApplication *app); /** * アプリの非同期処理を行う */ typedef void (*GLApplication_async)(struct GLApplication *app); /** * レンダリングエリアが変更された */ typedef void (*GLApplication_surface_changed)(struct GLApplication *app); /** * アプリのレンダリングを行う * 毎秒60回前後呼び出される。 */ typedef void (*GLApplication_rendering)(struct GLApplication *app); /** * アプリのデータ削除を行う */ typedef void (*GLApplication_destroy)(struct GLApplication *app); /** * アプリに与えられるデータ * プラットフォームごとに適当な拡張を行なっている。 */ typedef struct GLApplication { /** * View(レンダリングターゲット)の幅 */ int surface_width; /** * View(レンダリングターゲット)の高さ */ int surface_height; /** * アプリ実行フラグ */ int flags; /** * プラットフォーム固有データを格納する。 * サンプルアプリから扱う必要はない。 */ void* platform; /** * 初期化関数 */ GLApplication_initialize initialize; /** * 非同期処理 */ GLApplication_async async; /** * サーフェイスサイズ変更関数 */ GLApplication_surface_changed resized; /** * レンダリング関数 */ GLApplication_rendering rendering; /** * 解放関数 */ GLApplication_destroy destroy; /** * サンプルごとの拡張データ保持用変数。 * 自由に構造体等をallocして利用する。 * XXX_destroy時に必ずfreeを行うこと。 */ void* extension; } GLApplication; /** * ファイルのフルパス -> ファイル名に変換する('/'区切り専用) */ extern char* util_getFileName(char* __file__); /** * ダイアログを出して実行を停止する */ extern void GLApplication_abortWithMessage(GLApplication *app, const char* message); /** * アプリ実行を停止している場合はapp_TRUE */ extern bool GLApplication_isAbort(GLApplication *app); /** * ファイル系サポート関数 */ #include "support_RawData.h" /** * GL系サポート関数宣言 */ #include "support_gl.h" #endif

sample_skelton.c↓

#include "support.h" /** * アプリの初期化を行う */ void sample_Skelton_initialize(GLApplication *app) { __log("initialize"); } /** * レンダリングエリアが変更された */ void sample_Skelton_resized(GLApplication *app) { __logf("resized(%d x %d)", app->surface_width, app->surface_height); } /** * アプリのレンダリングを行う * 毎秒60回前後呼び出される。 */ void sample_Skelton_rendering(GLApplication *app) { // __log("rendering"); } /** * アプリのデータ削除を行う */ void sample_Skelton_destroy(GLApplication *app) { __log("destroy"); }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

AndroidではOpenGL ESのAPIが提供されてます。Javaで書けます(シェーダコード除く)。
リファレンスはこちら
私は数年前にOpenGL ES2.0での実装経験しかありませんが、こんな感じで書きます。
手元のソースから抜粋:

Java

1// ActivityとView 2 : 3import android.opengl.GLSurfaceView; 4 : 5 6public class GameActivity extends Activity { 7 // GLビュー 8 private GLView glView; 9 10 @Override 11 protected void onCreate(Bundle savedInstanceState) { 12 super.onCreate(savedInstanceState); 13 : 14 // GLビュー 15 glView = new GLView(stageData, screenMode, animation); 16 : 17 } 18 19 private class GLView extends GLSurfaceView { 20 // メインのレンダラ 21 private GameRenderer gr; 22 23 public GLView(ClusterStageData stageData, 24 int screenMode, boolean animation) { 25 super(GameActivity.this); 26 gr = new GameRenderer(GameActivity.this, stageData, 27 screenMode, animation, new GLColor(0.0076f, 0.0076f, 0.2025f, 1.0f)); 28 setEGLContextClientVersion(2); 29 setRenderer(gr); 30 } 31 } 32}

Java

1// レンダラ 2 : 3import android.opengl.GLES20; 4import android.opengl.GLSurfaceView.Renderer; 5import android.opengl.GLUtils; 6import android.opengl.Matrix; 7 : 8 9final class GameRenderer implements Renderer { 10 11 /** 12 * 頂点シェーダ。変換行列*座標データの形式 13 */ 14 private static final String VERTEX_SHADER_CODE = 15 "attribute vec4 vPos;" + 16 "uniform mat4 vModelviewM;" + 17 "attribute vec4 uvPos;" + 18 "uniform mat4 uvTranslateM;" + 19 "varying vec2 uvFPos;" + 20 "void main() {" + 21 "gl_Position = vModelviewM * vPos;" + 22 "uvFPos = vec2(uvTranslateM * uvPos);" + 23 "}"; 24 : 25 @Override 26 public void onSurfaceCreated(GL10 gl, EGLConfig config) { 27 GLES20.glClearColor(bgColor.getRed(), bgColor.getGreen(), bgColor.getBlue(), bgColor.getAlpha()); 28 // シェーダを作成し、プログラム開始 29 int vertexShader = Utility.loadShader(GLES20.GL_VERTEX_SHADER, VERTEX_SHADER_CODE); 30 int fragmentShader = Utility.loadShader(GLES20.GL_FRAGMENT_SHADER, FRAGMENT_SHADER_CODE); 31 : 32 } 33 : 34 @Override 35 public void onDrawFrame(GL10 gl) { 36 GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT); 37 GLES20.glUseProgram(program); 38 GLES20.glActiveTexture(GLES20.GL_TEXTURE0); 39 GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, frameTexture); 40 : 41 } 42 : 43}

流れとしてはandroid.opengl.GLSurfaceViewに描画時に呼ばれるonDrawFrameなどを提供するandroid.opengl.GLSurfaceView.Rendererの実装を渡す感じです。
そしてレンダラの中でOpenGL ESのAPIを色々使います。ここまでの流れはGoogleなどで検索すればたくさん出てくると思います。
以降は、私もやりたいことのCのソースやOpenGL ESのリファレンスとにらめっこしてJavaで実装していったという感じです。基本的にはCと同じ名前のAPIがあるので、それを使えば大丈夫です。

最近はAndroidのAPIはOpenGL ES3.2まで対応しているようなので違う部分があるかもしれませんし、実装方法も変わってるかもしれませんが、私も趣味でいじった程度なのであまり詳しくありません…。

投稿2016/10/01 20:25

guest1213

総合スコア306

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2016/10/08 12:24

回答ありがとうございました。
guest

0

そこで質問としてお聞きしたいのはC言語で記載されているものを
どうやったらJavaで動かすことができるかです。

質問はCからJavaへの移植についてだと思いますが(Android でC言語で書かれたものを動かすという意味という事も考えられちょっと心配しております)、個人的には、移植するより条件にあった書籍を購入し、勉強されたほうが良いと思います。

AndroidでOpenGLESをとなると

  • Android NDKを利用し、ネイティブから呼び出す
  • Android NDKを利用せず、AndroidライブラリのOpenGLをラップしたクラスを使って呼び出す

という方法があり

購入された書籍は、Android NDKを利用しネイティブから呼び出す実装になっていると思われます。
表題にマルチプラットフォームとありますから当然そうなると思います。

syusuketyoさんとしては、AndroidのJavaでOpenGL ES2.0を勉強したいというふうに読めますので、
もう一方のAndroid NDKを使わないで、AndroidライブラリのOpenGLをラップしたクラスを使って呼び出す方法で書かれている書籍を購入されて勉強されたほうが良いと思います。

投稿2016/10/01 15:23

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問