Я пытаюсь передать массив вершин и соответствующий им цвет для смешивания тесселяции GL. Мой код очень уродливый и, вероятно, содержит много ошибок, но главная проблема в том, что я не могу передать массив вершин и цветов в GLSL. Я хотел бы знать способ сделать это без GLSL, если это возможно. Спасибо.
Я пытался использовать устаревшие функции GLSL GL без толку, а также немного возился с моим файлом шейдера. Кажется, он не хочет отображать форму.
main.cpp void 'display ()':
void display(void)
{
//glfwMakeContextCurrent(wavebricks_window); glLoadIdentity();
//glTranslatef(1.5f, 0.0f, -7.0f);
for (int it =0; it<instruments.size();it++){
alGetSourcef(instruments[it].soundsource, AL_SEC_OFFSET, &tracking);
instruments[it].currentStep=tracking*(60/tempo);
instruments[it].currentStep=tracking;
instruments[it].tempo=tempo;
instruments[it].render();
float verts[instruments[it].voices_spinner*3];
float colors[instruments[it].voices_spinner*4];
std::string vertexShader;
std::string fragmentShader;
unsigned int indices[instruments[it].voices_spinner*3];
for (int i=0;i<instruments[it].voices_spinner;i++){
indices[i]=i;
}
for (int i=instruments[it].voices_spinner-1;i>=0;i--){
indices[instruments[it].voices_spinner+i]=instruments[it].voices_spinner-1-i;
}
for (int i=instruments[it].voices_spinner-1;i>=0;i--){
indices[instruments[it].voices_spinner*2+i]=i;
}
for(int i=0; i<instruments[it].voices_spinner; i++){
verts[3*i]=instruments[it].instrumentPoly[i][0];
cout<<"\n"<<verts[3*i]<<",";
verts[3*i+1]=instruments[it].instrumentPoly[i][1];
cout<<verts[3*i+1]<<",";
verts[3*i+2]=instruments[it].instrumentPoly[i][2];
cout<<verts[3*i+2]<<":";
colors[4*i]=-instruments[it].instrumentPoly[i][3];
cout<<colors[4*i]<<",";
colors[4*i+1]=-instruments[it].instrumentPoly[i][4];
cout<<colors[4*i+1]<<",";
colors[4*i+2]=-instruments[it].instrumentPoly[i][5];
cout<<colors[4*i+2]<<";\n";
colors[4*i+3]=1.0f;
}
Renderer renderer;
renderer.Clear();
VertexArray va;
VertexBuffer vb(verts, instruments[it].voices_spinner*3*4);
Shader shader("shade.shader", "shader2.shader");
VertexBufferLayout layout;
layout.Push<float>(3);
va.AddBuffer(vb, layout);
IndexBuffer ib(indices,instruments[it].voices_spinner * 3*4);
//shader.Bind();
shader.SetUniform4f("u_Color",0.8f,0.3f,0.8f,1.0f);
//va.Bind();
//ib.Bind();
//GLint MaxPatchVertices = 0;
//glGetIntegerv(GL_MAX_PATCH_VERTICES, &MaxPatchVertices);
//printf("Max supported patch vertices %d\n", MaxPatchVertices);
glPatchParameteri(GL_PATCH_VERTICES, instruments[it].voices_spinner*3);
renderer.Draw(va, ib, shader);
float r = 0.0f;
float increment=0.05f;
/*va.Unbind();
vb.Unbind();
ib.Unbind();
shader.Unbind();*/
}
}
shader.shader:
#version 420
#extension GL_ARB_separate_shader_objects : enable
uniform vec3 initialUniform = vec3(1.0, 0.0, 0.0);
layout(vertices = 128) uniform initialUniform out;
void main(){
gl_out[gl_InvocationID].gl_Position= gl_in[gl_InvocationID].gl_Position;// and then set tessellation levels
}
in gl_PerVertex {
vec4 gl_Position;
float gl_PointSize;
float gl_ClipDistance[]
} gl_in[gl_PatchVerticesIn];
shader2.shader:
#version 420
#GL_ARB_separate_shader_objects : enable
uniform vec3 initialUniform = vec3(1.0, 0.0, 0.0);
layout (triangles, equal_spacing, ccw) uniform initialUniform in;
out vec4 color;
void main()
{
float u=gl_TessCoord.x;
float omu= 1-u;
float v = gl_TessCoord.y;
float omv = 1-v;
float m = gl_TessCoord.z;
float omm = 1-m;
color = gl_TessCoord;
gl_Position =
omu * omv * gl_in[0].gl_Position +
u* omv * gl_in[1].gl_Position +
u*v*gl_in[2].gl_Position+
omu*v*gl_in[3].gl_Position;
}
in gl_PerVertex {
vec4 gl_Position;
float gl_PointSize;
float gl_ClipDistance[]
} gl_in[gl_PatchVerticesIn];
out gl_PerVertex
{
vec4 gl_Position;
float gl_PointSize;
float gl_ClipDistance[]
};
Я ожидаю увидеть на экране переменные фигуры с их вычисленными вершинами и цветами. Вместо этого я ничего не вижу. На самом деле, я пытаюсь создать мозаику с треугольниками и даже не знаю, как настроить координаты 3D-шейдеров. Пожалуйста, помогите.