Вобщем копаюсь в 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.