Пример #1
0
void GLSLShader::initialize()
{
    //#0 PREPARE SHADER
    GLuint vertexShader;
    GLuint fragmentShader;
    vertexShader    =  prepareShader("basicNew.vert", GLSL::VERTEX);
    fragmentShader  = prepareShader("basicNew.frag", GLSL::FRAGMENT);

    //#1 CREATE PROGRAM HANDLER
    programHandle = glCreateProgram();
    //programHandle = glCreateProgram();
    if(0 == programHandle)
    {
        logString +=  "Error creating program object\n";
        exit(1);
    }

    //#2 ATTACH SHADER TO PROGRAM
    glAttachShader( programHandle, fragmentShader );
    glAttachShader( programHandle, vertexShader );

/////////////////////////////////////////////////////////////////////////////////////////////////////

    std::vector<Eigen::Vector4f> vdata;
    vdata.push_back(Eigen::Vector4f(-1, -1, 0, 1));
    vdata.push_back(Eigen::Vector4f(1, -1, 0, 1));
    vdata.push_back(Eigen::Vector4f(0, 1, 0, 1));

    std::vector<Eigen::Vector4f> vdataColor;
    vdataColor.push_back(Eigen::Vector4f(1, 0, 0, 1));
    vdataColor.push_back(Eigen::Vector4f(0, 1, 0, 1));
    vdataColor.push_back(Eigen::Vector4f(0, 0, 1, 1));

    createVertexAttribute(0, "in_Vertex_Position", vdata);
//    createVertexTFAttribute(0, "in_Vertex_Position", vdata);
    size = vdata.size() * 4;
    createVertexTFAttribute2("Color");
//    createVertexAttribute(1, "in_Vertex_Color", vdataColor);


//////////////////////////////////////////////////////////////////////


    //#3 LINK PROGRAM
    link();

    //#4 USE PROGRAM
    if(isLinked())use();

    printActiveAttribs();
}
Пример #2
0
void Shader::initialize()
{
    //#0 PREPARE SHADER
    GLuint vertexShader    = prepareShader("basic.vert", GL_VERTEX_SHADER);
    GLuint fragmentShader  = prepareShader("basic.frag", GL_FRAGMENT_SHADER);
    //#1 CREATE PROGRAM HANDLER
    programHandle = glCreateProgram();
    if(0 == programHandle)
    {
        std::cout << "Error creating program object" << std::endl;
        exit(1);
    }

    //#2 ATTACH SHADER TO PROGRAM
    glAttachShader( programHandle, fragmentShader );
    glAttachShader( programHandle, vertexShader );

    //#3 LINK PROGRAM
    glLinkProgram(programHandle);

    //#4 VERIFY LINK STATUS
    GLint status;
    glGetProgramiv(programHandle, GL_LINK_STATUS, &status);
    if( GL_FALSE == status ) {
        std::cout << "LINKING - FAILED TO LINKING SHADER PROGRAM" << std::endl;
        GLint logLen;
        glGetProgramiv(programHandle, GL_INFO_LOG_LENGTH, &logLen);
        if(logLen > 0)
        {
            char *log = (char *)malloc(logLen);
            GLsizei written;
            glGetProgramInfoLog(programHandle, logLen, &written, log);
            std::cout << "PROGRAM LINK FAIL LOG | " << log << std::endl;
        }
    } else {
        std::cout << "OK - PROGRAM LINKED" << std::endl;
        glUseProgram(programHandle);
    }
    preparePerVertexAttributes();
}
ShaderAtomicCounterOpsTestBase::ShaderPipeline::ShaderPipeline(glu::ShaderType testedShader, AtomicOperation* newOp)
	: m_program(NULL), m_programCompute(NULL), m_testedShader(testedShader), m_atomicOp(newOp)
{
	m_shaders[glu::SHADERTYPE_VERTEX] = "#version 450 core\n"
										"<head>"
										"in highp vec2 inPosition;\n"
										"out highp vec3 vsPosition;\n"
										"out highp vec4 vsColor;\n"
										"void main()\n"
										"{\n"
										"	gl_Position = vec4(inPosition, 0.0, 1.0);\n"
										"	vsPosition = vec3(inPosition, 0.0);\n"
										"	vec4 outColor = vec4(1.0);\n"
										"<atomic_operation>"
										"	vsColor = outColor;\n"
										"}\n";

	m_shaders[glu::SHADERTYPE_FRAGMENT] = "#version 450 core\n"
										  "<head>"
										  "in highp vec4 gsColor;\n"
										  "out highp vec4 fsColor;\n"
										  "void main()\n"
										  "{\n"
										  "	vec4 outColor = gsColor; \n"
										  "<atomic_operation>"
										  "	fsColor = outColor;\n"
										  "}\n";

	m_shaders[glu::SHADERTYPE_TESSELLATION_CONTROL] = "#version 450 core\n"
													  "<head>"
													  "layout(vertices = 3) out;\n"
													  "in highp vec4 vsColor[];\n"
													  "in highp vec3 vsPosition[];\n"
													  "out highp vec3 tcsPosition[];\n"
													  "out highp vec4 tcsColor[];\n"
													  "void main()\n"
													  "{\n"
													  "	tcsPosition[gl_InvocationID] = vsPosition[gl_InvocationID];\n"
													  "	vec4 outColor = vsColor[gl_InvocationID];\n"
													  "<atomic_operation>"
													  "	tcsColor[gl_InvocationID] = outColor;\n"
													  "	gl_TessLevelInner[0] = 3;\n"
													  "	gl_TessLevelOuter[0] = 3;\n"
													  "	gl_TessLevelOuter[1] = 3;\n"
													  "	gl_TessLevelOuter[2] = 3;\n"
													  "}\n";

	m_shaders[glu::SHADERTYPE_TESSELLATION_EVALUATION] = "#version 450 core\n"
														 "<head>"
														 "layout(triangles, equal_spacing, cw) in;\n"
														 "in highp vec3 tcsPosition[];\n"
														 "in highp vec4 tcsColor[];\n"
														 "out highp vec4 tesColor;\n"
														 "void main()\n"
														 "{\n"
														 "	vec3 p0 = gl_TessCoord.x * tcsPosition[0];\n"
														 "	vec3 p1 = gl_TessCoord.y * tcsPosition[1];\n"
														 "	vec3 p2 = gl_TessCoord.z * tcsPosition[2];\n"
														 "	vec4 outColor = tcsColor[0];\n"
														 "<atomic_operation>"
														 "	tesColor = outColor;\n"
														 "	gl_Position = vec4(normalize(p0 + p1 + p2), 1.0);\n"
														 "}\n";

	m_shaders[glu::SHADERTYPE_GEOMETRY] = "#version 450 core\n"
										  "<head>"
										  "layout(triangles) in;\n"
										  "layout(triangle_strip, max_vertices = 3) out;\n"
										  "in highp vec4 tesColor[];\n"
										  "out highp vec4 gsColor;\n"
										  "void main()\n"
										  "{\n"
										  "	for (int i = 0; i<3; i++)\n"
										  "	{\n"
										  "		gl_Position = gl_in[i].gl_Position;\n"
										  "		vec4 outColor = tesColor[i];\n"
										  "<atomic_operation>"
										  "		gsColor = outColor;\n"
										  "		EmitVertex();\n"
										  "	}\n"
										  "	EndPrimitive();\n"
										  "}\n";

	m_shaders[glu::SHADERTYPE_COMPUTE] = "#version 450 core\n"
										 "<head>"
										 "layout(rgba32f, binding = 2) writeonly uniform highp image2D destImage;\n"
										 "layout (local_size_x = 16, local_size_y = 16) in;\n"
										 "void main (void)\n"
										 "{\n"
										 "	vec4 outColor = vec4(1.0);\n"
										 "<atomic_operation>"
										 "	imageStore(destImage, ivec2(gl_GlobalInvocationID.xy), outColor);\n"
										 "}\n";

	// prepare shaders

	std::stringstream atomicOperationStream;

	atomicOperationStream << "uint returned = " << m_atomicOp->getFunction() + "(counter, ";
	if (m_atomicOp->getCompareValue() != 0)
	{
		atomicOperationStream << m_atomicOp->getCompareValue();
		atomicOperationStream << "u, ";
	}
	atomicOperationStream << m_atomicOp->getParamValue();
	atomicOperationStream << "u);\n";
	atomicOperationStream << "uint after = atomicCounter(counter);\n";

	if (m_atomicOp->shouldTestReturnValue())
	{
		atomicOperationStream << "if(after == returned) outColor = vec4(0.0f);\n";
	}

	atomicOperationStream << "atomicCounterIncrement(calls);\n";

	std::string headString = "#extension GL_ARB_shader_atomic_counters: enable\n"
							 "#extension GL_ARB_shader_atomic_counter_ops: enable\n"
							 "layout (binding=0) uniform atomic_uint counter;\n"
							 "layout (binding=1) uniform atomic_uint calls;\n";

	for (unsigned int i = 0; i < glu::SHADERTYPE_LAST; ++i)
	{
		prepareShader(m_shaders[i], "<head>", i == testedShader ? headString : "");
		prepareShader(m_shaders[i], "<atomic_operation>", i == testedShader ? atomicOperationStream.str() : "");
	}
}