Android OpenGL ES और 2D


95

खैर, यहाँ मेरा अनुरोध है। मैं पहले से ही OpenGL को नहीं जानता, और मैं इसे सीखने के लिए तैयार नहीं हूं, मैं OpenGL ES को सीधे सीखना चाहता हूं क्योंकि मैं अपने विकास को एंड्रॉइड पर लक्षित कर रहा हूं, हालांकि। मैं अपने 2D गेम्स को विकसित करने के लिए OpenGL ES सीखना चाहता हूं । मैंने इसे प्रदर्शन के उद्देश्य के लिए चुना (क्योंकि आरटी गेम की बात आते ही बेसिक सर्फेस व्यू ड्राइंग उतना कुशल नहीं है)। मेरा सवाल है: कहां से शुरू करें? मैंने Google को ब्राउज़ करने और कुछ ट्यूटोरियल / उदाहरणों को पढ़ने / आज़माने में एक महीने से अधिक का समय बिताया है, लेकिन ईमानदार होने के लिए, यह बहुत मदद नहीं करता है और यह दो कारणों से है:

  1. मेरे द्वारा आए लगभग सभी लेख / ट्यूटोरियल 3D संबंधित हैं (मैं केवल यह सीखना चाहता हूं कि मेरे 2D स्प्राइट्स ड्राइंग कैसे करें)
  2. वहाँ से शुरू करने के लिए कोई आधार नहीं है क्योंकि सभी लेख एक विशिष्ट चीज़ों को लक्षित करते हैं जैसे: "त्रिकोण कैसे बनाएं (कोने के साथ)", "मेष कैसे बनाएं" ... आदि।

मैंने कुछ स्रोत कोड भी पढ़ने की कोशिश की है (उदाहरण: प्रतिकृति द्वीप) लेकिन कोड बहुत जटिल हैं और इसमें बहुत सारी चीजें शामिल हैं जो आवश्यक नहीं हैं; परिणाम: मैं अजीब श्रेणी के नाम और सामान के साथ 100 .java फ़ाइलों के बीच खो जाता हूं।

मुझे लगता है कि कोई ऐसा पाठ्यक्रम नहीं है जिसकी मैं तलाश कर रहा हूं, लेकिन मुझे बहुत खुशी होगी अगर कोई मुझे कुछ दिशा-निर्देश दे सकता है और कुछ लिंक शायद सीख सकता है कि मैं क्या कर रहा हूं (केवल ओपनजीएल ईएस 2 डी स्प्राइट्स रेंडरिंग! कुछ भी नहीं 3 डी! )।


33
and I'm not willing to learn itयहाँ एक सवाल शुरू करने का यह बहुत अच्छा तरीका नहीं है
फल्मरी

62
कृपया मेरा पूरा प्रश्न पढ़ें, आपने इसका एक संवेदनशील हिस्सा लिया और सबसे महत्वपूर्ण पूर्णता छोड़ दी: "मैं ओपनजीएल को पहले से नहीं जानता, और मैं इसे सीखने के लिए तैयार नहीं हूं, मैं तब से सीधे ओपन ES सीखना चाहता हूं। Android के लिए मेरे विकास को लक्षित करना "अगर मैं केवल एम्बेडेड उपकरणों पर OpenGL ES के साथ काम करने जा रहा हूं, तो OpenGL सीखने की बात क्या है? चीयर्स
4

5
यह देखते हुए कि OpenGL ES ज्यादातर OpenGL का सबसेट है, मुझे यह कहने की बात नहीं दिख रही है कि आप OpenGL सीखने नहीं जा रहे हैं, क्योंकि परिभाषा के अनुसार आपके पास होने वाले हैं।
डैश-टॉम-बैंग

2
BTW- रेप्लिका द्वीप देखने में बहुत सुंदर जगह है। आप इसके साथ शुरुआत कर सकते हैं और इसमें बदलाव करके शुरुआत कर सकते हैं। उन चीज़ों को स्ट्रिप करें जिन्हें आप नहीं चाहते या ज़रूरत नहीं है, और फिर 100 कक्षाएं 99 हो जाती हैं 98 फिर 97 ...
डैश-टॉम-बैंग

जवाबों:


85

मैं ऐसी ही स्थिति में था।
जिस तरह से मैंने ओपन के साथ शुरुआत की थी वह बहुत ही बुनियादी GLSurfaceView नमूने / डेमो को देखकर शुरू किया था।

प्रारंभ करें, अपनी एप्लिकेशन गतिविधि सेट करके, और मूल कैनवास सेट अप करें।

प्रतिकृति द्वीप स्रोत कोड फ़ाइल में एक लूट ले लो: GameRenderer.java 2 डी (स्प्राइट) प्रतिपादन के लिए उचित जीएल झंडे के साथ अपने कैनवास को कैसे स्थापित किया जाए। आपको वास्तव में प्रतिकृति द्वीप के एक ही लेखक द्वारा SpriteMethodTest पर नज़र डालनी चाहिए: http://code.google.com/p/apps-for-android/source/browse/trunk/SpriteMethodTest

यह प्रश्न देखें कि मैंने अपना कोड कहाँ पोस्ट किया था: कैनवस - एंड्रॉइड को बदलने के लिए ओपनजीएल का उपयोग करना

अपना कैनवास सेट करने के बाद, आप कुछ इस तरह से कॉल करना शुरू करते हैं: gl.glClear (GL10.GL_COLOR_BUFFER_BIT);

उसके बाद आप स्प्राइट रेंडर करने के लिए तैयार हैं। सबसे पहले, आपको स्प्राइट को एक बनावट में लोड करने की आवश्यकता होगी: http://qdevarena.blogspot.com/2009/02/how-to-load-texture-in-android-opengl.html

हालाँकि, यह ट्यूटोरियल है जिसने मुझे लोडिंग स्प्राइट के साथ वास्तव में मदद की: http://tkcodesharing.blogspot.com/2008/05/working-with-textures-in-androids.html

यह मैं इसे कैसे करता हूं, मेरे पास Texture.java नामक एक वर्ग है:

public class Texture
{
    /*Begin public declarations*/
    public float x = 0;
    public float y = 0;
    public float z = 0;
    public float width = 0;
    public float height = 0;
    /*Begin Private Declarations*/
    private GL10 gl;
    public int[] texture;    //holds the texture in integer form
    private int texture_name;
    private int[] mCropWorkspace;
    private final BitmapFactory.Options sBitmapOptions;


/*Begin Methods*/
public Texture( GL10 gl_obj )
{
    gl = gl_obj;
    texture = new int[1];
    mCropWorkspace = new int[4];
    sBitmapOptions = new BitmapFactory.Options();
    sBitmapOptions.inPreferredConfig = Bitmap.Config.RGB_565;
    //Log.d(TAG, "Initializing Texture Object");
}    
public int get_texture_name( )
{
    return texture_name;
}

/*Loads the resource to memory*/
public boolean Load( Bitmap bitmap ) //rename this to glLoad and don't have it as an initializer parameter
{
    /*many thanks to sprite method test if this works*/
    if ( gl == null )
    {
        Log.e(TAG, "Failed to load resource.  Context/GL is NULL");
        return false;
    }
    int error;

    int textureName = -1;
    gl.glGenTextures(1, texture, 0);
    textureName = texture[0];

    //Log.d(TAG, "Generated texture: " + textureName);
    gl.glBindTexture(GL10.GL_TEXTURE_2D, textureName);
    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_NEAREST);
    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR);
    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_S, GL10.GL_CLAMP_TO_EDGE);
    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_T, GL10.GL_CLAMP_TO_EDGE);
    gl.glTexEnvf(GL10.GL_TEXTURE_ENV, GL10.GL_TEXTURE_ENV_MODE, GL10.GL_REPLACE);

    GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0);

    mCropWorkspace[0] = 0;
    mCropWorkspace[1] = bitmap.getHeight();
    mCropWorkspace[2] = bitmap.getWidth();
    mCropWorkspace[3] = -bitmap.getHeight();

    ((GL11) gl).glTexParameteriv(GL10.GL_TEXTURE_2D, 
            GL11Ext.GL_TEXTURE_CROP_RECT_OES, mCropWorkspace, 0);

    error = gl.glGetError();
    if (error != GL10.GL_NO_ERROR)
    { 
        Log.e(TAG, "GL Texture Load Error: " + error);

    }
    //Log.d(TAG, "Loaded texture: " + textureName);
    return true;
 }
}

तब मेरे onDrawFrame () विधि में मैं बस यही करता हूं:

Texture texture = ...
gl.glBindTexture(GL10.GL_TEXTURE_2D, texture.texture[0]);
((GL11Ext) gl).glDrawTexfOES((float)(draw_x + 0.5), (float)(draw_y + 0.5), 0, tile_width, tile_height);

यह आपको एक ओपनजीएल कैनवास पर 2 डी स्प्राइट ड्राइंग के साथ जाना चाहिए। मैंने देखा है कि इस पर कोई सीधा ट्यूटोरियल नहीं है। उम्मीद है कि भविष्य में मैं अपने देव ब्लॉग में एक पोस्ट करूंगा: http://developingthedream.blogspot.com/


7
यार बहुत बहुत धन्यवाद! मैंने कभी भी इन जैसी दिशाएँ नहीं प्राप्त की हैं, यह वही है जिसकी मुझे तलाश थी! और मैं आपके ब्लॉग पर नज़र
रखूंगा

1
ओपी के रूप में एक ही स्थिति में और उत्तर देने के लिए उसके जैसा आभारी। अपने खेल / ब्लॉग के साथ शुभकामनाएँ। thx फिर से
unR

1
धन्यवाद @ मिगुएल मोरालेस मैं जीएल के साथ 2 डी ड्राइंग के लिए लुक से थक गया था। जैसा कि CoolStraw ने कहा कि इसमें बहुत सारी अनावश्यक चीजों के साथ बहुत अधिक ट्यूटोरियल हैं। वह जवाब क्रिस्टल की तरह साफ था।
एवरेन ओजटर्क

@ मिगुएल मोरालेस बहुत कोशिशों के बाद भी मैं ऐसा कुछ नहीं बना सकता कि मेरे बनावट काले दिखें। मैंने एक सवाल पूछा है stackoverflow.com/questions/9624260/… क्या आप एक बार देख सकते हैं?
एवरेन ओजटर्क

12

2 डी प्रोग्रामिंग सिर्फ 3 डी प्रोग्रामिंग है जो एक विमान के लिए विवश है। 3 डी सीखने के अलावा आपके पास कोई विकल्प नहीं होगा, लेकिन जब आप इसका उपयोग कर रहे हों तो बस z = 0 सेट करें।

OpenGL ES पर एक ऑफिशियल बुक है। इसके बाद आपको वह इंट्रो मिल सकता है: http://www.amazon.com/OpenGL-ES-2-0-Programming-Guide/dp/0321502795/


8
पांडित्यपूर्ण होने के लिए, आप अभी भी Z का उपयोग करते हैं ताकि आप हार्डवेयर को आपके लिए सॉर्ट कर सकें। बड़ा बदलाव यह है कि (संभावना) 2 डी एप्लिकेशन एक परिप्रेक्ष्य के बजाय एक ऑर्थोग्राफ़िक दृश्य का उपयोग करेगा।
डैश-टॉम-बैंग

आपके उत्तर के लिए बहुत-बहुत धन्यवाद, आपका कथन मुझे दिखाता है कि मैं Opengl और Opengl ES परिभाषा के बारे में गलत था।
CoolStraw

3

मैं निश्चित रूप से एंड्रॉइड चेकआउट करूंगा - क्रिस प्रूइट Google IO व्याख्यान एंड्रॉइड रिडक्स के लिए वास्तविक समय के खेल लिखना

पीडीएफ को भी पकड़ो

यह वास्तव में कई स्तरों पर मददगार है, क्रिस के पास मोबाइल उपकरणों के लिए गेम बनाने का बहुत अच्छा अनुभव है

लेकिन यदि आप वास्तव में 2 डी पर ध्यान केंद्रित कर रहे हैं तो कैनवास http://developer.android.com/guide/topics/graphics/index.html#drawing-with-canvas से शुरू करें

एक अन्य विकल्प स्किल लेवल पर निर्भर है फ्लैश + एडोबएआईआर को एंड्रॉइड पर, मैं खुद को पसंद करता हूं और लविंग प्रोग्रामिंग स्तर और जैसा कि आप आगे विकसित करना शुरू करते हैं, आपको पता चल जाएगा कि क्यों।

OpenGL: चेक फॉर - नेहे प्रोडक्शंस

कुछ ऐप्स जिन्हें आप अपने फोन पर रखना चाहते हैं, वे इसके लायक हैं और वे मुफ़्त हैं: ओपनजीएल डेमो, मिन 3 डी फ्रेमवर्क, रेडबुक नमूना



0

मैं देख रहा हूँ कि बहुत सी अच्छी जानकारी पहले ही प्रदान की जा चुकी है। मैं एक ऐसी साइट को साझा करना चाहता था जो OpenGLE पर त्वरित गति प्राप्त करने में मदद करे! इसमें केवल कुछ महीनों का समय था और कार्टेशियन समन्वय प्रणाली के आधार पर एक कस्टम समन्वय प्रणाली थी। मैं संवर्धित वास्तविकता तकनीकों का उपयोग करके 3D ऑब्जेक्ट नो कैमरा प्रस्तुत करने में सक्षम था।

मैंने केवल प्रोग्रामिंग अनुभव के साथ शुरू किया, कोई ओपनगेल अनुभव के साथ। मैंने रे वेंडरलिच के ट्यूटोरियल साइट का उपयोग किया। दी गई जानकारी शीर्ष पायदान और समझने में आसान है। वह अधिकाँश अधकचरी सूचनाओं के माध्यम से कटौती करता है और आपको वह चीज प्रदान करता है जो आपको जल्दी से उत्पादक होने के लिए जानना आवश्यक है। मैं इस ट्यूटोरियल को शुरुआती बिंदु के रूप में सुझाता हूं: http://www.raywenderlich.com/5223/beginning-opengl-es-2-0-with-glkit-part-1

आईओएस के लिए लर्निंग ओपनजीएल ईएस शीर्षक से एक अन्य संसाधन जो मैं सुझाऊंगा, वह एरिक एम बक की एक पुस्तक है।

IOS बुक कवर आर्ट के लिए OpenGL ES सीखना

कुछ ने इसकी आलोचना करते हुए कहा कि यह बहुत सरल था। लेकिन यह वही है जिसकी मुझे तलाश थी। इसने मुझे सभी मूल बातों को समझने में मदद की और मुझे एक विचार दिया कि मुझे और अधिक उन्नत चीजें सीखने के लिए कहां जाना चाहिए। लेकिन आश्चर्य की बात नहीं है, मैं रे की साइट और एरिक की किताब से सीखी गई सरल तकनीकों का उपयोग करके अपने संवर्धित वास्तविकता ऐप का निर्माण करने में सक्षम था। साझा करने के लिए उन दोनों के लिए धन्यवाद !!!


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.