# مباحث متفرقه برنامه نویسی > طراحی و ساخت بازی‌های کامپیوتری > آموزش: OpenGL ES در اندروید

## amin1softco

سلام بعد از مدتی دوباره وقت آزاد پیدا کردم و می خواهم اگر شد بحث OpenGL ES در اندروید را شروع کنم . البته من خودم همیشه وقتی مبتدی هستم مقاله نویسیم گل می کنه پس ممکنه اشتباهاتی هم در نوشته هام باشه که دوستانی که کار کردند بیاند شرح و اصلاحش را ذکر کنند ما هم تصحیح می کنیم .

مقدمات :
اندروید از چند لایه تشکیل شده که در شکل زیر می تونید این لایه ها را ببنید 

همانطور که در شکل می بینید این لینوکس دلاور میاد و با سخت ترین قسمت اندروید دست و پنجه نرم می کنه یعنی درایور های سخت افزاری را راه اندازی می کنه و بعد از اون

 لایه کتابخانه های داخلی اندروید قرار گرفته همانطور که در شکل مشخص است OpenGL ES  و همینطور پایگاه داده SQLite مشاهده می شه که ما ازشون می تونم استفاده کنیم 

همانطورم که می دونید دالویک یک نسخه بهبود یافته از j2me است و در نتیجه شما در این لحظه دو تا راه دارید یا اینکه با سی++ و بطور native برای اندروید برنامه بنویسید که باید به ndk مراجعه کنید و خلاصه مدیریت و حافظه و عملکرد و اینا بیافته گردن خودتون ولی به زبان سی ++ یا سی کدتون را می نویسید که عملکرد برنامتون به مراتب بالاتر است یا اینکه بیایید از همین جاوا استفاده کنید و بیخیال پرفرمنس خیلی رویایی بشید (البته QT برای زبان سی++ و xamarin برای زبان سی شارپ به شما امکان کد نویسی را می دهند) که مورد بحث ما نیستند . 
و ما در اینجا بیخیال پرفرمنس و این داستانا میشیم و میریم به صورت عادی با همون جاوا OpenGL ES را به کار بگیریم و دقیقاً در بالاترین لایه در تصویربالا شروع به کد نویسی خواهیم کرد . 
نکته دیگه اینه که شما چه در سی شارپ و چه در اندروید می تونید از کلاس گرافیک استفاده کنید و شکل های ساده را ترسیم کنید و خودتون را اصلاً با openGL در گیر نکنید .
برای شروع باید برید و sdk اندروید که به همراه اکلیپس ارائه شده را دانلود کنید.

حالا اگر دانلود شد میام ادامشو می نویسم فعلاً :D


یکسری اصطلاحات در آندروید هست که بدونید بهتره : 
*اکتیویتی ها (Activities)*
 اکتیویتی، واسط گرافیکی است که کل صفحه نمایشگر را در اختیار بگیرد.  اکتیویتی میتواند از چندین View تشکیل شده باشد یا به UI عملکرد مورد نیازش  را بدهد. بعنوان مثال برنامه ارسال ایمیل. میتواند شامل دو اکتیویتی باشد.  یکی شامل تمامی ایمیل هایی که دریافت کرده ایم، دیگری اکتیویتی که شامل  محیط نوشتن ایمیل و ارسال آن باشد. هر دو اکتیوی به هم مربوط می باشند ولی  عملکرد آنها کاملاً مستقل از یکدیگر است.
*سرویس ها (Services)*
 یک سرویس در بک گراند (background) اجرا میشود و UI یا واسط کاربری  ندارد. مثالی برای سرویس ها اطلاعی (notification) است که بوسیله زنگ و  روشن شدن صفحه نمایشگر در زمان دریافت SMS یا ایمیل و یا زمانیکه کسی با ما  تماس میگیرد، ارسال میشود.
*Content providers (تامین کنندگان محتوا!)* 
 از طریق Content provider ها دسترسی به تمامی اطلاعات ذخیره شده در گوشی  – توسط برنامه های دیگر و یا برنامه ای که ما مینویسیم – امکان پذیر است.  برای اینکه سایر برنامه ها بتوانند به اطلاعات دسترسی داشته باشند، معمولاً  اطلاعات در فایل ها یا دیتابیس ذخیره میشوند.
*Layout (قیافه!:) )* 
 Layout ها شامل المانهای طراحی واسط کاربری هستند. هر زمانیکه یک فایل  XML برای واسط کاربری ایجاد میکنیم، نیاز به Layout داریم تا طراحی ما را  در خودش نگه دارد. در مورد Layout ها در نوشته های بعدی شرح ییشتری خواهم  داد. پنج نوع Layout مختلف داریم که حتی میتوانند تو در تو بکار گرفته  شوند.
*View*
 View یک عضو مستقل (single object) در واسط کاربری است. View در  داخل Layout قرار میگیرد و از ترکیب View ها ساده ترین تا پیچیده ترین واسط  های گرافیکی و غیر گرافیکی کاربری ساخته میشود. بعنوان مثال، برچسب  (Label) یک نوع View است. اندروید این قابلیت را دارد که ما طرحهای گرافیکی  خود را بر اساس XML تولید کنیم و در قسمت کد صرفاً به عملکرد  (functionality) برنامه بپردازیم و بدین سبب از پیچیدگی برنامه بکاهیم.
*اتفاقات (Events)* 
 Event ها اتفاقاتی هستند مانند کلیک کردن یا لمس کردن، که برای دریافت این اتفاقات متد Listener آن اتفاق باید تعریف شود. Eventاتفاقی  است که از بیرون رخ میدهد؛ چیزی است که کنترل آن دست ما نیست؛ یا حتی  چیزیست که ما نمیدانیم کی اتفاق میافتد. بدین منظور کنترلر های اتفاق  (Events controllers) مورد استفاده قرار میگیرند. این امکان وجود دارد که  برای هر اتفاقی که رخ میدهد به سیستم بگوییم که چه کاری انجام دهد. معمول  ترین اتفاق دریافت لمس صفحه نمایشگر است که برای دریافت آن Listener مورد  نیاز باید تنظیم شود.
*منابع (Resources)* 
 منابع، المانهای خارجی هستند که ما در برنامه خود بکار  میگیریم. آنها  در فولدر “res” ذخیره میشوند و میتوانند فایلهای تصویری، صوتی مانند عکس،  فیلم، انیمیشن و موزیک باشند. همچنین فایلهای XML که شامل طراحی های پوسته،  واسط کاربری و تم ها هستند، در این پوشه ذخیره میشوند. وقتی عملیات  کامپایل انجام میشود، آنها بطور کامل از طریق کدهای جاوا قابل دسترسی  هستند.
منبع : کمالان



لینک های مفید : پورت آموزش های nehe در اندروید 
آموزش مختصر در باب openGL es

----------


## mjbbest

سلام به همگی دوستان
من یک کد ساده‌ای دارم در OpenGL ES 1.0 اندروید و  میخوام اونو ببرم به OpengGL ES 2.0. این کد فقط 20 تا نقطه ورودی میگیره و  این نقاط را به هم وصل میکنه که یک موج سینوسی حاصل می شود.
برای ارتقا  کد ها به نسخه دو باید چکار کنم؟ میدونم باید vertshader و fragshader  اضافه کنم و یه سری کار دیگه اما اصلا نمیدونم چطوری. ممنون میشم اگه کسی  کمک بکنه. 
خیلی ممنون
کد ها در ادامه آمده است.

Activity main=
public class mainActivuty extends Activity {
    private GLSurfaceView surface;
    public void onCreate(Bundle bundle) {
        super.onCreate(bundle);
        surface = new GLSurfaceView(this);
        surface.setEGLContextClientVersion(1);
        surface.setRenderer(new MyGLRenderer());
        
        setContentView(surface);
    }
    
    public void onPause(){
        super.onPause();
        surface.onPause();        
    }
    
    public void onResume() {
        super.onResume();
        surface.onResume();
    }
}


Renderer=

public class MyGLRenderer implements Renderer {
    Shape s;

    public MyGLRenderer() {
        s = new Shape();
    }

    public void onSurfaceCreated(GL10 gl, EGLConfig config) {
        gl.glClearColor(0.0f, 0.0f, 0.5f, 0.5f);
    }

    public void onDrawFrame(GL10 gl) {
        gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
        gl.glLoadIdentity();
        gl.glTranslatef(0, 0, -8);
        s.draw(gl);
    }

    public void onSurfaceChanged(GL10 gl, int width, int height) {
        gl.glViewport(0, 0, width, height);
        gl.glMatrixMode(GL10.GL_PROJECTION);
        gl.glLoadIdentity();
        GLU.gluPerspective(gl, 45.0f, (float) width / (float) height, 0.1f,
                100.0f);
        gl.glMatrixMode(GL10.GL_MODELVIEW);
        gl.glLoadIdentity();
    }

    @Override
    public void onSurfaceCreated(GL10 arg0, javax.microedition.khronos.egl.EGLConfig arg1) {
        // TODO Auto-generated method stub
        
    }


}


و کلاس Shape:

public class Shape {
        
    float vertices[] =  {
            -3.14f, -0.00159265f, 0f,
            -2.826f, -0.31038f, 0f,
            -2.512f, -0.588816f, 0f,
            -2.198f, -0.809672f, 0f,
            -1.884f, -0.951351f, 0f,
            -1.57f, -1f, 0f,
            -1.256f, -0.950859f, 0f,
            -0.942f, -0.808736f, 0f,
            -0.628f, -0.587528f, 0f,
            -0.314f, -0.308866f, 0f,
            0f, 0f, 0f,
            0.314f, 0.308866f, 0f,
            0.628f, 0.587528f, 0f,
            0.942f, 0.808736f, 0f,
            1.256f, 0.950859f, 0f,
            1.57f, 1f, 0f,
            1.884f, 0.951351f, 0f,
            2.198f, 0.809672f, 0f,
            2.512f, 0.588816f, 0f,
            2.826f, 0.31038f, 0f,
            3.14f, 0.00159265f, 0f
            }; 
            private short[] indices = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20};
            
            FloatBuffer vertexBuffer;
            ShortBuffer indexBuffer;
            public Shape() {
            ByteBuffer bb = ByteBuffer.allocateDirect(vertices.length * 4);
            bb.order(ByteOrder.nativeOrder());
            vertexBuffer = bb.asFloatBuffer();
            vertexBuffer.put(vertices);
            vertexBuffer.position(0);
            
            ByteBuffer bb2=ByteBuffer.allocateDirect(indices.length*2);
            bb2.order(ByteOrder.nativeOrder());
            indexBuffer=bb2.asShortBuffer();
            indexBuffer.put(indices);
            indexBuffer.position(0);
            }
            
            public void draw(GL10 gl) {
            gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
            gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer);
            gl.glDrawElements(GL10.GL_LINE_STRIP,indices.lengt  h,GL10.GL_UNSIGNED_SHORT,indexBuffer);
            gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
            }
    
}

----------


## amin1softco

برای استفاده از opengl ES 2.0 باید اول در بخش منیفست پروژه تعریفش کنید به این شکل 

<uses-feature android:glEsVersion="0x00020000"
              android:required="true" />




بعدشم چک کنید ببنید دیوایز مورد نظر پشتیبانی می کنه ازش یا خیر 


private boolean hasGLES20() {
    ActivityManager am = (ActivityManager)
                getSystemService(Context.ACTIVITY_SERVICE);
    ConfigurationInfo info = am.getDeviceConfigurationInfo();
    return info.reqGlEsVersion >= 0x20000;
}




بعدشم کد هاتون را می نویسید دیگه می تونید به لینک های زیر مراجعه کنید 
https://www.khronos.org/assets/uploa...ide_sample.pdf
https://blog.jayway.com/2013/05/09/o...tting-started/

----------

