С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

Xamarin

Войти
Регистрация
Восстановить пароль
 
Programmer86
0 / 0 / 0
Регистрация: 18.01.2013
Сообщений: 16
Завершенные тесты: 1
#1

Не могу запустить OpenGL ES 3.0 в Xamarin - Xamarin

08.09.2016, 18:19. Просмотров 437. Ответов 2
Метки нет (Все метки)

Здравствуйте, форумчане. Недавно начал изучать OpenGL es 3.0. Читаю книгу "opengl es 3.0 programming guide 2nd edition". Дочитал до первого примера (отрисовка треугольника) и не как не могу его запустить.
В какой момент нужно инициализировать шейдеры (Init()? Привильно ли я записываю шейдеры? На данный момент приложение просто вылетает. Буду благодарен любой помощи. (Код в вложениях)

MainActivity
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
using System;
using Android.App;
using Android.Content;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using Android.OS;
using Android.Content.PM;
 
namespace GraphicsEngine
{
    [Activity(Label = "GraphicsEngine",
        MainLauncher = true,
        Icon = "@drawable/icon",
        ConfigurationChanges = ConfigChanges.Orientation | ConfigChanges.KeyboardHidden
#if __ANDROID_11__
        ,HardwareAccelerated=false
#endif
        )]
    public class MainActivity : Activity
    {
        GraphicsEngine view;
 
        protected override void OnCreate(Bundle bundle)
        {
            base.OnCreate(bundle);
 
            // Create our OpenGL view, and display it
            view = new GraphicsEngine(this);
            SetContentView(view);
        }
 
        protected override void OnPause()
        {
            base.OnPause();
            view.Pause();
        }
 
        protected override void OnResume()
        {
            base.OnResume();
            view.Resume();
        }
    }
}


GraphicsEngine-OSDependent.cs
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
using System;
using OpenTK;
using OpenTK.Graphics;
using OpenTK.Graphics.ES30; //ES11;
using OpenTK.Platform;
using OpenTK.Platform.Android;
using Android.Views;
using Android.Content;
using Android.Util;
 
namespace GraphicsEngine
{
    partial class GraphicsEngine : AndroidGameView
    {
        public GraphicsEngine(Context context) : base(context)
        {
            //GLContextVersion = GLContextVersion.Gles3_0;
            ContextRenderingApi = GLVersion.ES3;
        }
 
        // This gets called when the drawing surface is ready
        protected override void OnLoad(EventArgs e)
        {
            base.OnLoad(e);
 
            // Run the render loop
            Run();
        }
 
        // This method is called everytime the context needs
        // to be recreated. Use it to set any egl-specific settings
        // prior to context creation
        //
        // In this particular case, we demonstrate how to set
        // the graphics mode and fallback in case the device doesn't
        // support the defaults
        protected override void CreateFrameBuffer()
        {
            // the default GraphicsMode that is set consists of (16, 16, 0, 0, 2, false)
            try
            {
                Log.Verbose("GLCube", "Loading with default settings");
                
                // if you don't call this, the context won't be created
                base.CreateFrameBuffer();                
                return;
            }
            catch (Exception ex)
            {
                Log.Verbose("GLCube", "{0}", ex);
            }
 
            // this is a graphics setting that sets everything to the lowest mode possible so
            // the device returns a reliable graphics setting.
            try
            {
                Log.Verbose("GLCube", "Loading with custom Android settings (low mode)");
                GraphicsMode = new AndroidGraphicsMode(0, 0, 0, 0, 0, false);
 
                // if you don't call this, the context won't be created
                Init();
                base.CreateFrameBuffer();
                
                return;
            }
            catch (Exception ex)
            {
                Log.Verbose("GLCube", "{0}", ex);
            }
            throw new Exception("Can't load egl, aborting");
        }
    }
}


GraphicsEngine.cs
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
using System;
using OpenTK;
using OpenTK.Graphics;
using OpenTK.Graphics.ES30; //ES11;
using OpenTK.Platform;
using OpenTK.Platform.Android;
using Android.Views;
using Android.Content;
using Android.Util;
 
namespace GraphicsEngine
{
    partial class GraphicsEngine
    {
        int mainProgrammObject = 0;
 
        bool Init()
        {
 
            int vertexShader, fragmentShader;
            int programObject;
            int linked;
 
            vertexShader = LoadShader(All.VertexShader, vShaderStr);
            fragmentShader = LoadShader(All.FragmentShader, fShaderStr);
 
            programObject = GL.CreateProgram();
 
            if (programObject == 0)
                return false;
 
            GL.AttachShader(programObject, vertexShader);
            GL.AttachShader(programObject, fragmentShader);
 
            GL.LinkProgram(programObject);
 
            GL.GetProgram(programObject, All.LinkStatus, out linked);
 
            if (linked == 0)
            {
                int infoLen = 0;
                GL.GetProgram(programObject, All.InfoLogLength, out infoLen);
                if (infoLen > 1)
                {
                    //Здесь нужен код для просмотра сообщения об ошибке вроде этого:
 
                    //char* infoLog = malloc(sizeof(char) * infoLen);
                    //glGetProgramInfoLog(programObject, infoLen, NULL, infoLog);
                    //esLogMessage("Error linking program:\n%s\n", infoLog);
                    //free(infoLog);
                }
 
                GL.DeleteProgram(programObject);
                return false;
            }
 
            mainProgrammObject = programObject;
            GL.ClearColor(0.0f, 0.0f, 0.0f, 0.0f);
            return true;
        }
 
        int LoadShader(All type, string[] source)
        {
            int shader;
            int compiled;
 
            shader = GL.CreateShader(type);
 
            if (shader == 0)
                return 0;
 
            int[] len = new int[source.Length];
            for (int i = 0; i < source.Length; i++)
            {
                len[i] = source[i].Length;
            }
            
            GL.ShaderSource( shader, 1, source, (int[])null);
            GL.CompileShader(shader);
 
            GL.GetShader(shader, All.CompileStatus, out compiled);
            if (compiled == (int)All.False)
            {
                int infoLen;
                GL.GetShader(shader, All.InfoLogLength, out infoLen);
 
                if (infoLen > 1)
                {
                    //Здесь нужен код для просмотра сообщения об ошибке вроде этого:
 
                    //char* infoLog = malloc(sizeof(char) * infoLen);
                    //glGetShaderInfoLog(shader, infoLen, NULL, infoLog);
                    //esLogMessage ( "Error compiling shader:\n%s\n", infoLog );
                    //free(infoLog);
                    
                    System.Text.StringBuilder error = new System.Text.StringBuilder(infoLen);
                    GL.GetShaderInfoLog(shader, infoLen, (int[])null, error);
                    string s = error.ToString();
 
                    string ss = GL.GetString(All.ShadingLanguageVersion);
                    string ss2 = GL.GetString(All.Version);
 
                }
 
                GL.DeleteShader(shader);
                return 0;
            }
 
            return shader;
        }
 
        // This gets called on each frame render
        protected override void OnRenderFrame(FrameEventArgs e)
        {
            base.OnRenderFrame(e);
 
            float[] vVertices =
            {
                0.0f, 0.5f, 0.0f,
                -0.5f, -0.5f, 0.0f,
                0.5f, -0.5f, 0.0f
            };
 
            GL.Viewport(0, 0, 500, 500);
            GL.Clear(ClearBufferMask.ColorBufferBit);
            GL.UseProgram(mainProgrammObject);
            GL.VertexAttribPointer(0, 3, All.Float, false, 0, vVertices);
            GL.EnableVertexAttribArray(0);
 
            GL.DrawArrays(All.Triangles, 0, 3);
            
 
            //GL.MatrixMode(All.Projection);
            //GL.LoadIdentity();
            //GL.Ortho(-1.0f, 1.0f, -1.5f, 1.5f, -1.0f, 1.0f);
            //GL.MatrixMode(All.Modelview);
            //GL.Rotate(3.0f, 0.0f, 0.0f, 1.0f);
 
            //GL.ClearColor(0.5f, 0.5f, 0.5f, 1.0f);
            //GL.Clear((uint)All.ColorBufferBit);
 
            //GL.VertexPointer(2, All.Float, 0, square_vertices);
            //GL.EnableClientState(All.VertexArray);
            //GL.ColorPointer(4, All.UnsignedByte, 0, square_colors);
            //GL.EnableClientState(All.ColorArray);
 
            //GL.DrawArrays(All.TriangleStrip, 0, 4);
 
            //SwapBuffers();
        }
 
        string[] vShaderStr = {
            "#version 300 es                          \n",
            "layout(location = 0) in vec4 vPosition;  \n",
            "void main()                              \n",
            "{                                        \n",
            "   gl_Position = vPosition;              \n",
            "}                                        \n"
        };
 
        string[] fShaderStr = {
            "#version 300 es                              \n",
            "precision mediump float;                     \n",
            "out vec4 fragColor;                          \n",
            "void main()                                  \n",
            "{                                            \n",
            "   fragColor = vec4 ( 1.0, 0.0, 0.0, 1.0 );  \n",
            "}                                            \n"
        };
 
    }
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.09.2016, 18:19
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Не могу запустить OpenGL ES 3.0 в Xamarin (Xamarin):

Не могу подписать приложение и запустить на устройстве. Xamarin for Mac - Xamarin
Хочу запустить приложение на своем iPad устройстве. Однако при компиляции пишет &quot;Error: No installed provisioning profiles match the...

Не могу найти в Xamarin кнопки и т.д - Xamarin
Не могу найти где находиться такие кнопки , Лайбли и т.д. где искать эту панель в Xamarin

Xamarin ругается на RAM, открыть приложение не могу - Xamarin
При запуске эмулятора android пишет что нехватает памяти, хотя у меня 4 гига. Запускается с эмулятором android 4.4, который требует 1...

Не могу добавить на форму никаких элементов в Xamarin Studio (проект GTK#) - Xamarin
Установил Xamarin Studio 4.2.2 на Win 7, хотел создать форму автоматом, посмотреть, как она генерируется, но не получается из списка...

Как запустить OpenGL через Code::Blocks - C++
Добрый вечер! Перечитав, кучу информации по установке, а так же перепробовав кучу - вердикт: ничего не получается!!!! Можете по...

Как запустить свою OpenGL прогу на чужом компьютере ? - OpenGL
Пишу на windows 8, VC++,скомпилировал программу и взял exe в папке debug, добавил туда шейдеры и т. д. На моем компе все работает,а вот...

2
Programmer86
0 / 0 / 0
Регистрация: 18.01.2013
Сообщений: 16
Завершенные тесты: 1
09.09.2016, 00:09  [ТС] #2
Вроде получилось запустить, что сделал:
-В ссылках поставил OpenTK-1.0 (C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\MonoAndroid\v6.0\OpenTK-1.0.dll)
-Инициализацию ( Init() ) делаю в событии OnLoad(), что бы, как я понимаю, context был создан и было что настраивать
-Запускаю на реальном девайсе (One plus one)
-Шейдеры записал в одну строку (до этого был массив строк) через "\n"

Вроде все работает, но ни чего не выводит(просто черный экран). Еще пробовал сделать GL.ClearColor(0.0f, 0.0f, 1.0f, 0.0f); но фон все так же черный. Исправленный (но все еще не рабочий) код приложу архивом.

Вот еще сомнительные моменты в выводе(за чем он пытается загрузить es 2.0, если у меня в проекте используется 3.0), может он поможет понять, что не так:
Кликните здесь для просмотра всего текста

DllImport attempting to load: 'libGLESv2.dll'.
09-09 02:05:27.180 D/Mono ( 6460): DllImport error loading library './libGLESv2.dll': 'dlopen failed: library "/data/app/GraphicsEngine.GraphicsEngine-1/lib/arm/./libGLESv2.dll" not found'.
09-09 02:05:27.182 D/Mono ( 6460): DllImport error loading library './libGLESv2.dll.so': 'dlopen failed: library "/data/app/GraphicsEngine.GraphicsEngine-1/lib/arm/libaot-libGLESv2.dll.so" not found'.
09-09 02:05:27.183 D/Mono ( 6460): DllImport error loading library '/system/lib/libGLESv2.dll': 'dlopen failed: library "/data/app/GraphicsEngine.GraphicsEngine-1/lib/arm//system/lib/libGLESv2.dll" not found'.
09-09 02:05:27.185 D/Mono ( 6460): DllImport error loading library '/system/lib/libGLESv2.dll.so': 'dlopen failed: library "/data/app/GraphicsEngine.GraphicsEngine-1/lib/arm/libaot-libGLESv2.dll.so" not found'.
09-09 02:05:27.185 D/Mono ( 6460): DllImport error loading library 'libGLESv2.dll': 'dlopen failed: library "/data/app/GraphicsEngine.GraphicsEngine-1/lib/arm/libGLESv2.dll" not found'.
09-09 02:05:27.187 D/Mono ( 6460): DllImport error loading library 'libGLESv2.dll.so': 'dlopen failed: library "/data/app/GraphicsEngine.GraphicsEngine-1/lib/arm/libaot-libGLESv2.dll.so" not found'.
09-09 02:05:27.188 D/Mono ( 6460): DllImport error loading library 'libGLESv2.dll': 'dlopen failed: library "/data/app/GraphicsEngine.GraphicsEngine-1/lib/arm/libGLESv2.dll" not found'.
09-09 02:05:27.190 D/Mono ( 6460): DllImport error loading library './libGLESv2': 'dlopen failed: library "/data/app/GraphicsEngine.GraphicsEngine-1/lib/arm/./libGLESv2" not found'.
09-09 02:05:27.190 D/Mono ( 6460): DllImport loaded library './libGLESv2.so'.
09-09 02:05:27.190 D/Mono ( 6460): DllImport searching in: 'libGLESv2.dll' ('./libGLESv2.so').
09-09 02:05:27.190 D/Mono ( 6460): Searching for 'glCreateShader'.
09-09 02:05:27.226 D/Mono ( 6460): DllImport searching in: 'libGLESv2.dll' ('./libGLESv2.so').
09-09 02:05:27.226 D/Mono ( 6460): Searching for 'glShaderSource'.
09-09 02:05:27.227 D/Mono ( 6460): DllImport searching in: 'libGLESv2.dll' ('./libGLESv2.so').
09-09 02:05:27.227 D/Mono ( 6460): Searching for 'glCompileShader'.
09-09 02:05:27.237 D/Mono ( 6460): DllImport searching in: 'libGLESv2.dll' ('./libGLESv2.so').
09-09 02:05:27.237 D/Mono ( 6460): Searching for 'glGetShaderiv'.
09-09 02:05:27.244 D/Mono ( 6460): DllImport searching in: 'libGLESv2.dll' ('./libGLESv2.so').
09-09 02:05:27.244 D/Mono ( 6460): Searching for 'glCreateProgram'.
09-09 02:05:27.245 D/Mono ( 6460): DllImport searching in: 'libGLESv2.dll' ('./libGLESv2.so').
09-09 02:05:27.245 D/Mono ( 6460): Searching for 'glAttachShader'.
09-09 02:05:27.246 D/Mono ( 6460): DllImport searching in: 'libGLESv2.dll' ('./libGLESv2.so').
09-09 02:05:27.246 D/Mono ( 6460): Searching for 'glLinkProgram'.
09-09 02:05:27.249 D/Mono ( 6460): DllImport searching in: 'libGLESv2.dll' ('./libGLESv2.so').
09-09 02:05:27.249 D/Mono ( 6460): Searching for 'glGetProgramiv'.
09-09 02:05:27.251 D/Mono ( 6460): DllImport searching in: 'libGLESv2.dll' ('./libGLESv2.so').
09-09 02:05:27.251 D/Mono ( 6460): Searching for 'glClearColor'.
0
Вложения
Тип файла: rar GraphicsEngine.rar (3.2 Кб, 2 просмотров)
Programmer86
0 / 0 / 0
Регистрация: 18.01.2013
Сообщений: 16
Завершенные тесты: 1
09.09.2016, 11:35  [ТС] #3
Проблему решил. Для android в конце отрисовки надо вызвать SwapBuffers().
Тему можно закрывать.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.09.2016, 11:35
Привет! Вот еще темы с ответами:

Tao OpenGL. Как запустить приложение в полноэкранном режиме 1920*1080 - C#
Подскажите, пожалуйста, как запустить приложение в полноэкранном режиме 1920*1080.

Не могу разобраться с OpenGl - OpenGL
Здравствуйте пользователи cyberforum.ru. Не мог бы кто нибудь мне разжевать основы OpenGl? Уроки NeHe мне практически ничего не дали. Я...

Не могу установить opengl - OpenGL
Не получается установить open gl Перехожу по ссылки https://www.opengl.org/resources/libraries/glut/ и скачиваю GLUT 3.7 Source Code...

Не могу разобраться с OpenGL - OpenGL
Всем привет! Недавно я решил начать изучение OpenGL. И сразу же запутался в этих аббревиатурах: GLU, GLUT, ... . Никаких нормальных...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.