Android
OpenGL ES 2.0+ के साथ शुरुआत करना
खोज…
परिचय
यह विषय Android पर OpenGL ES 2.0+ को स्थापित करने और उपयोग करने के बारे में है। OpenGL ES एम्बेडेड सिस्टम पर 2D और 3D त्वरित ग्राफिक्स के लिए मानक है - जिसमें कंसोल, स्मार्टफोन, उपकरण और वाहन शामिल हैं।
GLSurfaceView और OpenGL ES 2.0+ की स्थापना
अपने आवेदन में OpenGL ES का उपयोग करने के लिए आपको इसे प्रकट में जोड़ना होगा:
<uses-feature android:glEsVersion="0x00020000" android:required="true"/>
अपना विस्तारित GLSurfaceView बनाएं:
import static android.opengl.GLES20.*; // To use all OpenGL ES 2.0 methods and constants statically
public class MyGLSurfaceView extends GLSurfaceView {
public MyGLSurfaceView(Context context, AttributeSet attrs) {
super(context, attrs);
setEGLContextClientVersion(2); // OpenGL ES version 2.0
setRenderer(new MyRenderer());
setRenderMode(GLSurfaceView.RENDERMODE_CONTINUOUSLY);
}
public final class MyRenderer implements GLSurfaceView.Renderer{
public final void onSurfaceCreated(GL10 unused, EGLConfig config) {
// Your OpenGL ES init methods
glClearColor(1f, 0f, 0f, 1f);
}
public final void onSurfaceChanged(GL10 unused, int width, int height) {
glViewport(0, 0, width, height);
}
public final void onDrawFrame(GL10 unused) {
// Your OpenGL ES draw methods
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
}
}
}
अपने लेआउट में MyGLSurfaceView
जोड़ें:
<com.example.app.MyGLSurfaceView
android:id="@+id/gles_renderer"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
ओपनजीएल ईएस के नए संस्करण का उपयोग करने के लिए, अपने आयात में संस्करण संख्या को स्थैतिक आयात में बदलें और setEGLContextClientVersion
बदलें।
संपत्ति फ़ाइल से जीएलएसएल-ईएस शेडर्स का संकलन और लिंक करना
एसेट्स फ़ोल्डर आपके GLSL-ES shader फ़ाइलों को संग्रहीत करने के लिए सबसे आम जगह है। अपने OpenGL ES एप्लिकेशन में उनका उपयोग करने के लिए आपको उन्हें पहली बार एक स्ट्रिंग में लोड करना होगा। यह फ़ंक्शन एसेट फ़ाइल से एक स्ट्रिंग बनाता है:
private String loadStringFromAssetFile(Context myContext, String filePath){
StringBuilder shaderSource = new StringBuilder();
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(myContext.getAssets().open(filePath)));
String line;
while((line = reader.readLine()) != null){
shaderSource.append(line).append("\n");
}
reader.close();
return shaderSource.toString();
} catch (IOException e) {
e.printStackTrace();
Log.e(TAG, "Could not load shader file");
return null;
}
}
अब आपको एक फंक्शन बनाने की जरूरत है, जो स्टिंग में स्टोर की गई शेयर्ड को संकलित करता है:
private int compileShader(int shader_type, String shaderString){
// This compiles the shader from the string
int shader = glCreateShader(shader_type);
glShaderSource(shader, shaderString);
glCompileShader(shader);
// This checks for for compilation errors
int[] compiled = new int[1];
glGetShaderiv(shader, GL_COMPILE_STATUS, compiled, 0);
if (compiled[0] == 0) {
String log = glGetShaderInfoLog(shader);
Log.e(TAG, "Shader compilation error: ");
Log.e(TAG, log);
}
return shader;
}
अब आप अपने शेड्स को लोड, संकलन और लिंक कर सकते हैं:
// Load shaders from file
String vertexShaderString = loadStringFromAssetFile(context, "your_vertex_shader.glsl");
String fragmentShaderString = loadStringFromAssetFile(context, "your_fragment_shader.glsl");
// Compile shaders
int vertexShader = compileShader(GL_VERTEX_SHADER, vertexShaderString);
int fragmentShader = compileShader(GL_FRAGMENT_SHADER, fragmentShaderString);
// Link shaders and create shader program
int shaderProgram = glCreateProgram();
glAttachShader(shaderProgram , vertexShader);
glAttachShader(shaderProgram , fragmentShader);
glLinkProgram(shaderProgram);
// Check for linking errors:
int linkStatus[] = new int[1];
glGetProgramiv(shaderProgram, GL_LINK_STATUS, linkStatus, 0);
if (linkStatus[0] != GL_TRUE) {
String log = glGetProgramInfoLog(shaderProgram);
Log.e(TAG,"Could not link shader program: ");
Log.e(TAG, log);
}
यदि कोई त्रुटि नहीं है, तो आपका shader प्रोग्राम उपयोग के लिए तैयार है:
glUseProgram(shaderProgram);