Вобщем копаюсь в API OpenGL. Убил безрезультатно выходные разбираясь с шейдерами для OpenGL ES.
В идеале хотелось вывести картину для начала, но до картинок мне пока видимо как до китая раком.
 .
 . Либы libEGL.dll и libGLESv2.dll подключены, OpenGL ES API также прогружено и вроде как валидно.
Подскажите, люди добрые, пожалуста, куда двигать мысли?????
- Код: Выделить всё
 program Test1;
 {$mode objfpc}{$H+}
 uses
 {$IFDEF UNIX}{$IFDEF UseCThreads}
 cthreads,
 {$ENDIF}{$ENDIF}
 Classes,
 SysUtils,
 gles20,
 glu,
 Glut
 { you can add units after this };
 const
 // простой шейдер вершин
 SimpleVertexShader: AnsiString =
 '#version 330 core' + #$0d + #$0a +
 // Input vertex data, different for all executions of this shader.
 'layout(location = 0) in vec3 vertexPosition_modelspace;' + #$0d + #$0a +
 'layout(location = 1) in vec3 vertexColor;' + #$0d + #$0a +
 // Output data ; will be interpolated for each fragment.
 'out vec3 fragmentColor;' + #$0d + #$0a +
 // Values that stay constant for the whole mesh.
 'uniform mat4 MVP;' + #$0d + #$0a +
 'void main(){'+ #$0d + #$0a +
 // Output position of the vertex, in clip space : MVP * position
 'gl_Position = MVP * vec4(vertexPosition_modelspace,1);' + #$0d + #$0a +
 // The color of each vertex will be interpolated
 // to produce the color of each fragment
 'fragmentColor = vertexColor;' + #$0d + #$0a +
 '}';
 // простой фрагментный шейдер для вывода цветных вершин
 SimpleFragmentShaderColor: AnsiString =
 '#version 330 core' + #$0d + #$0a +
 // Interpolated values from the vertex shaders
 'in vec3 fragmentColor;'+ #$0d + #$0a +
 // Ouput data
 'out vec3 color;' + #$0d + #$0a +
 'void main(){' + #$0d + #$0a +
 // Output color = color specified in the vertex shader,
 // interpolated between all 3 surrounding vertices
 'color = fragmentColor;' + #$0d + #$0a +
 '}';
 var
 window: int32;
 arg_c: int32;
 chars: AnsiString;
 pch: PAnsiChar;
 ProgramID: GLInt;
 function LoadShader(const DataVertex, DataFragment: PAnsiChar): boolean;
 var
 VertexShaderID: GLuint;
 FragmentShaderID: GLuint;
 resGL: GLInt;
 InfoLogLength: int32;
 begin
 // Create the shaders
 VertexShaderID := glCreateShader(GL_VERTEX_SHADER);
 FragmentShaderID := glCreateShader(GL_FRAGMENT_SHADER);
 try
 // Compile Vertex Shader
 glShaderSource(VertexShaderID, 1, Ppchar(@DataVertex), nil);
 glCompileShader(VertexShaderID);
 // Check Vertex Shader
 glGetShaderiv(VertexShaderID, GL_COMPILE_STATUS, @resGL);
 glGetShaderiv(VertexShaderID, GL_INFO_LOG_LENGTH, @InfoLogLength);
 if ( InfoLogLength > 0 ) or (resGL = 0) then
 exit(false);
 // Compile Fragment Shader
 glShaderSource(FragmentShaderID, 1, Ppchar(@DataFragment), nil);
 glCompileShader(FragmentShaderID);
 // Check Fragment Shader
 glGetShaderiv(FragmentShaderID, GL_COMPILE_STATUS, @resGL);
 glGetShaderiv(FragmentShaderID, GL_INFO_LOG_LENGTH, @InfoLogLength);
 if ( InfoLogLength > 0 ) or (resGL = 0) then
 exit(false);
 // Link the program
 ProgramID := glCreateProgram();
 glAttachShader(ProgramID, VertexShaderID);
 glAttachShader(ProgramID, FragmentShaderID);
 glLinkProgram(ProgramID);
 // Check the program
 glGetProgramiv(ProgramID, GL_LINK_STATUS, @resGL);
 glGetProgramiv(ProgramID, GL_INFO_LOG_LENGTH, @InfoLogLength);
 if ( InfoLogLength > 0 ) or (resGL = 0) then
 exit(false);
 finally
 glDeleteShader(VertexShaderID);
 glDeleteShader(FragmentShaderID);
 end;
 end;
 procedure Display; cdecl;
 begin
 glClearColor(0.0, 0.0, 0.4, 0.0);
 glutSwapBuffers();
 end;
 begin
 chars := 'Test1.exe';
 // Установка размеров и положения окна
 glutInitWindowSize(640, 480);
 glutInitWindowPosition(0, 0);
 arg_c := 1;
 pch := @chars[1];
 glutInit(@arg_c , @pch);
 window := glutCreateWindow(pch);
 if window = 0 then
 exit;
 glutInitDisplayMode(GLUT_RGBA or GLUT_DOUBLE);
 glutSetWindow(window);
 // Регистрация вызываемых функций
 glutDisplayFunc(@Display);
 // Грузим шейдер
 LoadShader(@SimpleVertexShader[1], @SimpleFragmentShaderColor[1]);
 // Запуск механизма обработки событий
 glutMainLoop();
 glutDestroyWindow(window);
 end.




 
 
