Beispiel #1
0
/* Load vertex and fragment shader and return the compiled program */
GLuint GLWrapper::LoadShader(const char *vertex_path, const char *fragment_path)
{
    GLuint vertShader, fragShader;

    // Read shaders
    std::string vertShaderStr = readFile(vertex_path);
    std::string fragShaderStr = readFile(fragment_path);

    GLint result = GL_FALSE;
    int logLength;

    vertShader = BuildShader(GL_VERTEX_SHADER, vertShaderStr);
    fragShader = BuildShader(GL_FRAGMENT_SHADER, fragShaderStr);

    std::cout << "Linking program" << std::endl;
    GLuint program = glCreateProgram();
    glAttachShader(program, vertShader);
    glAttachShader(program, fragShader);
    glLinkProgram(program);

    glGetProgramiv(program, GL_LINK_STATUS, &result);
    glGetProgramiv(program, GL_INFO_LOG_LENGTH, &logLength);
    std::vector<char> programError((logLength > 1) ? logLength : 1);
    glGetProgramInfoLog(program, logLength, NULL, &programError[0]);
    std::cout << &programError[0] << std::endl;

    glDeleteShader(vertShader);
    glDeleteShader(fragShader);

    return program;
}
void init()
{
	glGenVertexArrays(1, &vao);
	glBindVertexArray(vao);

	const float vertexPositions[] = {
		0.75f, 0.75f, 0.0f, 1.0f,
		0.75f, -0.75f, 0.0f, 1.0f,
		-0.75f, -0.75f, 0.0f, 1.0f,
	};

	glGenBuffers(1, &positionBufferObject);
	glBindBuffer(GL_ARRAY_BUFFER, positionBufferObject);
	glBufferData(GL_ARRAY_BUFFER, sizeof(vertexPositions), vertexPositions, GL_STATIC_DRAW);
	glBindBuffer(GL_ARRAY_BUFFER, 0);

	const std::string vertexShader(
		"#version 330\n"
		"layout(location = 0) in vec4 position;\n"
		"void main()\n"
		"{\n"
		"   gl_Position = position;\n"
		"}\n"
		);

	const std::string fragmentShader(
		"#version 330\n"
		"out vec4 outputColor;\n"
		"void main()\n"
		"{\n"
		"   outputColor = vec4(0.0f, 0.0f, 0.0f, 1.0f);\n"
		"}\n"
		);

	GLuint vertShader = BuildShader(GL_VERTEX_SHADER, vertexShader);
	GLuint fragShader = BuildShader(GL_FRAGMENT_SHADER, fragmentShader);

	program = glCreateProgram();
	glAttachShader(program, vertShader);
	glAttachShader(program, fragShader);	
	glLinkProgram(program);

	GLint status;
	glGetProgramiv (program, GL_LINK_STATUS, &status);
	if (status == GL_FALSE)
	{
		if(!glext_ARB_debug_output)
		{
			GLint infoLogLength;
			glGetProgramiv(program, GL_INFO_LOG_LENGTH, &infoLogLength);

			GLchar *strInfoLog = new GLchar[infoLogLength + 1];
			glGetProgramInfoLog(program, infoLogLength, NULL, strInfoLog);
			fprintf(stderr, "Linker failure: %s\n", strInfoLog);
			delete[] strInfoLog;
		}

		throw std::runtime_error("Shader could not be linked.");
	}
}
GLuint RenderingEngine2::BuildProgram(const char* vertexShaderSource,
                                      const char* fragmentShaderSource) const
{
    GLuint vertexShader = BuildShader(vertexShaderSource, GL_VERTEX_SHADER);
    GLuint fragmentShader = BuildShader(fragmentShaderSource, GL_FRAGMENT_SHADER);

    GLuint programHandle = glCreateProgram();
    glAttachShader(programHandle, vertexShader);
    glAttachShader(programHandle, fragmentShader);
    glLinkProgram(programHandle);

    GLint linkSuccess;
    glGetProgramiv(programHandle, GL_LINK_STATUS, &linkSuccess);

    if (linkSuccess == GL_FALSE) {
        char messages[256];
        glGetProgramInfoLog(programHandle, sizeof(messages), 0, &messages[0]);
#ifdef __APPLE__
        printf("ERROR: %s",messages);
#endif
#ifdef ANDROID_NDK
        LOGI("ERROR: %s",messages);
#endif
    }

    return programHandle;
}
void RenderingEngine::BuildProgram(const char* vertexShaderSource,
                                   const char* fragmentShaderSource,
                                   ProgramHandles& program) const
{
    GLuint vertexShader = BuildShader(vertexShaderSource, GL_VERTEX_SHADER);
    GLuint fragmentShader = BuildShader(fragmentShaderSource, GL_FRAGMENT_SHADER);
    
    GLuint programHandle = glCreateProgram();
    glAttachShader(programHandle, vertexShader);
    glAttachShader(programHandle, fragmentShader);
    glLinkProgram(programHandle);
    
    GLint linkSuccess;
    glGetProgramiv(programHandle, GL_LINK_STATUS, &linkSuccess);
    if (linkSuccess == GL_FALSE) {
        GLchar messages[256];
        glGetProgramInfoLog(programHandle, sizeof(messages), 0, &messages[0]);
        std::cout << messages;
        exit(1);
    }
    
    program.Program = programHandle;

    AttributeHandles& attribs = program.Attributes;
    attribs.Position = glGetAttribLocation(programHandle, "Position");
    attribs.Normal = glGetAttribLocation(programHandle, "Normal");
    attribs.TexCoord = glGetAttribLocation(programHandle, "TextureCoordIn");
    
    UniformHandles& uniforms = program.Uniforms;
    uniforms.Projection = glGetUniformLocation(programHandle,  "Projection");
    uniforms.Modelview = glGetUniformLocation(programHandle,  "Modelview");
    uniforms.Sampler = glGetUniformLocation(programHandle,  "Sampler");
    uniforms.Model = glGetUniformLocation(programHandle,  "Model");
    uniforms.EyePosition = glGetUniformLocation(programHandle,  "EyePosition");
}
	//------------------------------------------------------------------------------
	int32 CGUIShader_opengl_base::LoadAndCompile(const CGUIString& rVertexShaderFileName, const CGUIString& rFragmentShaderFileName)
	{
#if defined(GUIEX_RENDER_OPENGL) || defined(GUIEX_RENDER_OPENGL_ES2)

		DestroyShader();

		//create shader
		m_uVertexShader = BuildShader(rVertexShaderFileName, GL_VERTEX_SHADER);
		m_uFragmentShader = BuildShader(rFragmentShaderFileName, GL_FRAGMENT_SHADER);

		m_uProgramId = glCreateProgram();
		glAttachShader(m_uProgramId, m_uVertexShader);
		glAttachShader(m_uProgramId, m_uFragmentShader);
		glLinkProgram(m_uProgramId);

		GLint linkSuccess;
		glGetProgramiv(m_uProgramId, GL_LINK_STATUS, &linkSuccess);
		if (linkSuccess == GL_FALSE) 
		{
			char messages[256];
			glGetProgramInfoLog(m_uProgramId, sizeof(messages), 0, &messages[0]);
			GUI_THROW( GUI_FORMAT( "[CGUIShader_opengl_base::LoadAndCompile]: %s", messages ));

			return -1;
		}
		CacheAttributeLoc();
		CacheUniformLoc();

#endif	//#if defined(GUIEX_RENDER_OPENGL) || defined(GUIEX_RENDER_OPENGL_ES2)
		return 0;
	}
Beispiel #6
0
    GLuint BuildProgram(const char* vsKey, const char* fsKey) {
        std::cout << "Compiling " << vsKey << "..." << std::endl;;
        const char* vsString = glswGetShader(vsKey);
        // PezCheckCondition(vsString, glswGetError());
        GLuint vsHandle = BuildShader(vsString, GL_VERTEX_SHADER);

        std::cout << "Compiling " << fsKey << "..." << std::endl;
        const char* fsString = glswGetShader(fsKey);
        // PezCheckCondition(fsString, glswGetError());
        GLuint fsHandle = BuildShader(fsString, GL_FRAGMENT_SHADER);

        std::cout << "Linking..." << std::endl;
        GLint linkSuccess;
        GLchar messages[256];
        GLuint programHandle = glCreateProgram();
        glAttachShader(programHandle, vsHandle);
        glAttachShader(programHandle, fsHandle);
        glBindAttribLocation(programHandle, SlotPosition, "Position");
        glBindAttribLocation(programHandle, SlotNormal, "Normal");
        glLinkProgram(programHandle);
        glGetProgramiv(programHandle, GL_LINK_STATUS, &linkSuccess);
        glGetProgramInfoLog(programHandle, sizeof(messages), 0, &messages[0]);
        // PezCheckCondition(linkSuccess, messages);
        return programHandle;
    }
Beispiel #7
0
AsShaderBuild AsShader::LoadShaderFromFile(std::string* pShaderPath, GLuint pNumFiles, GLenum pType)
{
	const char* tmpText = (const char*)"";

	AsShaderBuild log;
	log.mSuccess = GL_TRUE;

	for (GLuint it = 0; it < pNumFiles; it++)
    {

        unsigned char* text;

        std::ifstream file;
		file.open(pShaderPath[it].c_str(), ios::in); // opens as ASCII!
		if (!file) log.mSuccess = GL_FALSE;

        file.seekg(0, file.end);
        int len = file.tellg();

		if (len == 0) log.mSuccess = GL_FALSE;   // Error: Empty File

        text = (GLubyte*) new char[len+1];
		if (*text == 0) log.mSuccess = GL_FALSE;   // can't reserve memory

        // len isn't always strlen cause some characters are stripped in ascii read...
        // it is important to 0-terminate the real length later, len is just max possible value...
        text[len] = 0;

        GLuint i=0;
        while (file.good())
        {
           text[i] = file.get();       // get character from file.
           if (!file.eof())
            i++;
        }

        text[i] = 0;  // 0-terminate it at the correct position

        file.close();

        //now take the buffer and put it in the shader text

        tmpText += '\n';

        for(int ix = 0; ix < len; i++)
        {
            tmpText += text[ix];
        }

        delete[] text;
    }

    //now compile the shader
	if (log.mSuccess = GL_TRUE)
    {
        log = BuildShader(&tmpText, pType);
    }

	return log;
}
Beispiel #8
0
static GLuint BuildProgram(const char* vsKey, const char* fsKey)
{
    DebugString("Compiling '%s'...\n", vsKey);
    const char* vsString = glswGetShader(vsKey);
    if (!vsString)
    {
        FatalError("%s\n", glswGetError());
    }
    GLuint vsHandle = BuildShader(vsString, GL_VERTEX_SHADER);

    DebugString("Compiling '%s'...\n", fsKey);
    const char* fsString = glswGetShader(fsKey);
    if (!fsString)
    {
        FatalError("%s\n", glswGetError());
    }
    GLuint fsHandle = BuildShader(fsString, GL_FRAGMENT_SHADER);

    DebugString("Linking...\n");
    GLuint programHandle = glCreateProgram();
    glAttachShader(programHandle, vsHandle);
    glAttachShader(programHandle, fsHandle);
    glBindAttribLocation(programHandle, VertexAttributes::Position, "Position");
    glBindAttribLocation(programHandle, VertexAttributes::Normal, "Normal");
    glLinkProgram(programHandle);

    GLint linkSuccess;
    glGetProgramiv(programHandle, GL_LINK_STATUS, &linkSuccess);
    if (linkSuccess == GL_FALSE)
    {
        GLchar messages[256];
        glGetProgramInfoLog(programHandle, sizeof(messages), 0, &messages[0]);
        FatalError(messages);
    }
    else
    {
        GLchar messages[256];
        glGetProgramInfoLog(programHandle, sizeof(messages), 0, &messages[0]);
        DebugString(messages);
    }

    return programHandle;
}
Beispiel #9
0
/* Load vertex and fragment shader and return the compiled program */
GLuint GLWrapper::BuildShaderProgram(std::string vertShaderStr, std::string fragShaderStr)
{
    GLuint vertShader, fragShader;
    GLint result = GL_FALSE;

    try
    {
        vertShader = BuildShader(GL_VERTEX_SHADER, vertShaderStr);
        fragShader = BuildShader(GL_FRAGMENT_SHADER, fragShaderStr);
    }
    catch (std::exception &e)
    {
        throw std::exception("BuildShaderProgram() Build shader failure. Abandoning");
    }

    GLuint program = glCreateProgram();
    glAttachShader(program, vertShader);
    glAttachShader(program, fragShader);
    glLinkProgram(program);

    GLint status;
    glGetProgramiv(program, GL_LINK_STATUS, &status);
    if (status == GL_FALSE)
    {

        GLint infoLogLength;
        glGetProgramiv(program, GL_INFO_LOG_LENGTH, &infoLogLength);

        GLchar *strInfoLog = new GLchar[infoLogLength + 1];
        glGetProgramInfoLog(program, infoLogLength, NULL, strInfoLog);
        std::cerr << "Linker error: " << strInfoLog << std::endl;

        delete[] strInfoLog;
        throw std::runtime_error("Shader could not be linked.");
    }

    glDeleteShader(vertShader);
    glDeleteShader(fragShader);

    return program;
}
Beispiel #10
0
GLuint BuildProgram(const char *vShader,const char *fShader) const
{
    GLuint vertexShader=BuildShader(vShader,GL_VERTEX_SHADER);
    GLuint fragmentShader=BuildShader(fShader,GL_FRAGMENT_SHADER);

    GLuint programHandle=glCreateProgram();
    glAttachShader(programHandle,vertexShader);
    glAttachShader(programHandle,fragmentShader);
    glLinkProgram(programHandle);

    GLint linkSuccess;
    glGetProgramiv(programHandle,GL_LINK_STATUS,&linkSuccess);
    if(linkSuccess==GL_FALSE)
    {
        GLchar messages[256];
        glGetProgramInfoLog(programHandle,sizeof(messages),0,&messages[0]);
        printf("compile glsl error : %s\n",messages);
    }

    return programHandle;
}
Beispiel #11
0
    GLuint BuildProgram(const char *vertexShaderSource,
                        const char *fragmentShaderSource) {
        GLuint vertexShader = BuildShader(vertexShaderSource, GL_VERTEX_SHADER);
        GLuint fragmentShader = BuildShader(fragmentShaderSource, GL_FRAGMENT_SHADER);

        GLuint programHandle = glCreateProgram();
        glAttachShader(programHandle, vertexShader);
        glAttachShader(programHandle, fragmentShader);
        glLinkProgram(programHandle);

        GLint linkSuccess;
        glGetProgramiv(programHandle, GL_LINK_STATUS, &linkSuccess);
        if (linkSuccess == GL_FALSE) {
            GLchar messages[256];
            glGetProgramInfoLog(programHandle, sizeof(messages), 0, &messages[0]);
            std::cout << messages;
            exit(1);
        }

        return programHandle;
    }
NzSkyboxBackground::NzSkyboxBackground()
{
	if (!s_indexBuffer)
		s_indexBuffer = BuildIndexBuffer();

	if (!s_shader)
		s_shader = BuildShader();

	if (!s_vertexBuffer)
		s_vertexBuffer = BuildVertexBuffer();

	m_indexBuffer = s_indexBuffer;
	m_sampler.SetWrapMode(nzSamplerWrap_Clamp); // Nécessaire pour ne pas voir les côtés
	m_shader = s_shader;
	m_vertexBuffer = s_vertexBuffer;
}
Beispiel #13
0
bool TextureDemo::Init()
{
    if (!D3DApp::Init())
    {
        return false;
    }

    BuildGeometries();

    BuildShader();

    BuildInputLayout();

    LoadTexture();

    return true;
}
Beispiel #14
0
bool BaseApp::Init( HWND hWnd )
{
	DeviceDx11& refDevice = DeviceDx11::GetInstance();

	if( !refDevice.InitDevice( hWnd ) )
	{
		return false;
	}
	
	if( !SetUpDxResource( &refDevice ) )
	{
			return false;
			}

	if( !BuildShader( &refDevice ) )
	{
		return false;
	}

	m_pObject = new Object();
	m_pObject->Init();

	if( !CreateVertexBuffer() )
	{
		return false;
	}
	
	if(	!CreateIndexBuffer() )
	{
		return false;
	}

	if( !CreateConstantBuffer() )
	{
		return false;
	}		

	return true;
}
bool CRhGLShaderProgram::BuildProgram(const GLchar* VertexShader, const GLchar* FragmentShader)
{
  // Shaders MUST consist of both a vertex AND a fragment shader in 2.0...
  if ( (VertexShader == NULL) || (FragmentShader == NULL) )
    return false;
  
  PreBuild();
  
  GLuint  hVsh = BuildShader( VertexShader, GL_VERTEX_SHADER );
  GLuint  hFsh = BuildShader( FragmentShader, GL_FRAGMENT_SHADER );
  
  if ( (hVsh == 0) || (hFsh == 0) )
    return false;
  
  m_hProgram = glCreateProgram();
  if ( m_hProgram == 0 )
    return false;
  
  glAttachShader( m_hProgram, hVsh );
  glAttachShader( m_hProgram, hFsh );

  // These bindings are forced here so that mesh drawing can enable the
  // appropriate vertex array based on the same binding values. 
  // Note: These must be done before we attempt to link the program...
  // Note2: Rhino supports multiple textures but for now we'll only
  //        provide for a single set of texture coordinates.
  glBindAttribLocation( m_hProgram, ATTRIB_VERTEX,    "rglVertex" );
	glBindAttribLocation( m_hProgram, ATTRIB_NORMAL,    "rglNormal" );
	glBindAttribLocation( m_hProgram, ATTRIB_TEXCOORD0, "rglTexCoord0" );
	glBindAttribLocation( m_hProgram, ATTRIB_COLOR,     "rglColor"  );
  
  glLinkProgram( m_hProgram );

  GLint Success;
  
  glGetProgramiv( m_hProgram, GL_LINK_STATUS, &Success );
  if ( Success == GL_FALSE ) 
  {
#if defined(_DEBUG)
    GLint logLength;
    glGetProgramiv( m_hProgram, GL_INFO_LOG_LENGTH, &logLength );
    if (logLength > 0)
    {
      GLchar *log = (GLchar *)malloc(logLength);
      glGetProgramInfoLog( m_hProgram, logLength, &logLength, log);
      std::cout << "Program link log:\n" << log;
      free(log);
    }
#endif
    glDetachShader( m_hProgram, hVsh );
    glDetachShader( m_hProgram, hFsh );
    glDeleteProgram( m_hProgram );
    m_hProgram = 0;
  }
  
  glDeleteShader( hVsh );
  glDeleteShader( hFsh );
  
  if ( m_hProgram == 0 )
    return false;
  
  PostBuild();
  
  return true;
}
Beispiel #16
0
bool Init()
{
	srand(0);
	LOG::Initialize();
	
	if (SDL_Init(SDL_INIT_EVERYTHING) < 0)
	{
		LOG::Message("Unable to initialize SDL.");
		LOG::Message(SDL_GetError());
		return false;
	}
	SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
	SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 8);
	SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 8);
	SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 8);
	SDL_GL_SetAttribute(SDL_GL_ALPHA_SIZE, 8);
	SDL_WM_SetCaption("FractalDemo", "FractalDemo");

	Reshape(screen_width, screen_height);
	
	glewInit();
	if (!GLEW_VERSION_3_0)
	{
		LOG::Message("Requires OpenGL 3.0 or later.");
		return false;
	}
	
	LOG::Message("GL_VENDOR", (char*)glGetString(GL_VENDOR));
	LOG::Message("GL_RENDERER", (char*)glGetString(GL_RENDERER));
	LOG::Message("GL_VERSION", (char*)glGetString(GL_VERSION));
	LOG::Message("GL_SHADING_LANGUAGE_VERSION", (char*)glGetString(GL_SHADING_LANGUAGE_VERSION));

	const char* shader_error = "";
	
	if (!gluInitializeCompiler())
	{
		LOG::Message("Unable to initialize GLSL compiler.");
		return false;
	}
	if (!BuildShader(&ShaderProgram, vert_filepath, frag_filepath, &shader_error))
	{
		LOG::Message(shader_error);
		return false;
	}
	if (!BindUniforms(ShaderProgram, uniform_locations, num_of_uniforms))
	{
		LOG::Message("Could not bind uniforms.");
		return false;
	}
	if (!BindAttributes(ShaderProgram, attribute_locations, num_of_attributes))
	{
		LOG::Message("Could not bind attributes.");
		return false;
	}

	glGenBuffers(1, &array_buffer);
	glBindBuffer(GL_ARRAY_BUFFER, array_buffer);
	glBufferData(GL_ARRAY_BUFFER, 24 * sizeof(float), plane_data, GL_STATIC_DRAW);

	glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 4 * sizeof(float), 0);
	glEnableVertexAttribArray(0);

	reset();

	return true;
}
Beispiel #17
0
int	SceneBuilder::BuildObjectLOD(const Fmatrix& parent, CEditableObject* E, int sector_num)
{
	if (!E->m_objectFlags.is(CEditableObject::eoUsingLOD)) return -1;
    xr_string lod_name = E->GetLODTextureName();

    b_material 		mtl;
    mtl.surfidx		= (u16)BuildTexture		(LEVEL_LODS_TEX_NAME);
    mtl.shader      = (u16)BuildShader		(E->GetLODShaderName());
    mtl.sector		= (u16)sector_num;
    mtl.shader_xrlc	= -1;
    if ((u16(-1)==mtl.surfidx)||(u16(-1)==mtl.shader)) return -2;

    int mtl_idx		= FindInMaterials(&mtl);
    if (mtl_idx<0){
        l_materials.push_back(mtl);
        mtl_idx 	= l_materials.size()-1;
    }

    l_lods.push_back(e_b_lod());
    e_b_lod& b		= l_lods.back();
    Fvector    		p[4];
    Fvector2 		t[4];
    for (int frame=0; frame<LOD_SAMPLE_COUNT; frame++){
        E->GetLODFrame(frame,p,t,&parent);
        for (int k=0; k<4; k++){
            b.lod.faces[frame].v[k].set(p[k]);
            b.lod.faces[frame].t[k].set(t[k]);
        }
    }
    b.lod.dwMaterial= mtl_idx;
    b.lod_name		= lod_name.c_str();
    xr_string l_name= lod_name.c_str();
    u32 w,h;     
    int age;
    if (!ImageLib.LoadTextureData(l_name.c_str(),b.data,w,h,&age)){
    	Msg("!Can't find LOD texture: '%s'",l_name.c_str());
    	return -2;
    }
/*    if (age!=E->Version()){
    	Msg("!Invalid LOD texture version: '%s'",l_name.c_str());
    	return -2;
    }*/
    l_name 			+= "_nm";
    if (!ImageLib.LoadTextureData(l_name.c_str(),b.ndata,w,h,&age)){
    	Msg("!Can't find LOD texture: '%s'",l_name.c_str());
    	return -2;
    }
/*    if (age!=E->Version()){
    	Msg("!Invalid LOD texture version: '%s'",l_name.c_str());
    	return -2;
    }*/
//    b.data
/*
    // make lod
    Fbox bb						= E->GetBox();
    E->m_Flags.set				(CEditableObject::eoUsingLOD,FALSE);
    object_for_render			= E;
    ImageLib.CreateLODTexture	(bb, b.data, LOD_IMAGE_SIZE,LOD_IMAGE_SIZE,LOD_SAMPLE_COUNT);
    E->m_Flags.set				(CEditableObject::eoUsingLOD,TRUE);

    // build lod normals
    b.ndata.resize				(LOD_IMAGE_SIZE*LOD_IMAGE_SIZE*LOD_SAMPLE_COUNT);
    U8Vec hemi_temp				(LOD_IMAGE_SIZE*LOD_IMAGE_SIZE*LOD_SAMPLE_COUNT,0);
    Fvector o_center,o_size;
    Fmatrix M,Mi;
    bb.getradius				(o_size);
    bb.getcenter				(o_center);
    SPBItem* PB					= UI->ProgressStart(LOD_SAMPLE_COUNT*LOD_IMAGE_SIZE,lod_name.c_str());
    float dW 					= _max(o_size.x,o_size.z)/(LOD_IMAGE_SIZE/2);
    float dH 					= o_size.y/(LOD_IMAGE_SIZE/2);
    float dR					= bb.getradius();
    float d2R					= dR*2.f;
	XRC.ray_options				(CDB::OPT_CULL);
	ETOOLS::ray_options			(CDB::OPT_CULL);

    float tN=0.f,tH=0.f,tT=0.f,tR=0.f;
    
	float 	LOD_CALC_SAMPLES 	= Scene->m_LevelOp.m_LOD_Quality;
	s32		LOD_CALC_SAMPLES_LIM= LOD_CALC_SAMPLES/2;

    // preload textures
    for (SurfaceIt surf_it=E->Surfaces().begin(); surf_it!=E->Surfaces().end(); surf_it++){
    	CSurface* surf			= *surf_it;
        Shader_xrLC* c_sh		= EDevice.ShaderXRLC.Get(surf->_ShaderXRLCName());
        if (!c_sh->flags.bRendering) continue;
        if (0==surf->m_ImageData)surf->CreateImageData();
    }    

    // preload CF Model
    for (EditMeshIt mesh_it=E->Meshes().begin(); mesh_it!=E->Meshes().end(); mesh_it++)
		(*mesh_it)->GenerateCFModel();
    
    // calculate
    for (u32 sample_idx=0; sample_idx<LOD_SAMPLE_COUNT; sample_idx++){
    	float angle 			= sample_idx*(PI_MUL_2/LOD_SAMPLE_COUNT);
        M.setXYZ				(0,angle,0);
        M.translate_over		(o_center);
        Mi.invert				(M);
	    for (s32 iH=0; iH<LOD_IMAGE_SIZE; iH++){
        	PB->Inc				();
        	float Y				= (iH-(LOD_IMAGE_SIZE-1)/2)*dH;
		    for (s32 iW=0; iW<LOD_IMAGE_SIZE; iW++){
	        	float X			= (iW-LOD_IMAGE_SIZE/2)*dW;

                u32 pixel		= (LOD_IMAGE_SIZE-iH-1)*LOD_SAMPLE_COUNT*LOD_IMAGE_SIZE+LOD_IMAGE_SIZE*sample_idx+iW;
                u32& tgt_n		= b.ndata[pixel];
                u8& tgt_h		= hemi_temp[pixel];
                u8 src_a		= color_get_A	(b.data[pixel]);

				if (0==src_a)	continue;
                
                FvectorVec		n_vec;
                Fvector4Vec		sample_pt_vec;//(iFloor(LOD_CALC_SAMPLES*LOD_CALC_SAMPLES));
//.				FvectorVec		c_vec;
				Fvector			start;
CTimer 	TT,TT1;
TT.Start();
                SPickQuery 		PQ;
                for (s32 iiH=-LOD_CALC_SAMPLES_LIM; iiH<=LOD_CALC_SAMPLES_LIM; iiH++){
                	float dY	= iiH*(dH/LOD_CALC_SAMPLES);
                    for (s32 iiW=-LOD_CALC_SAMPLES_LIM; iiW<=LOD_CALC_SAMPLES_LIM; iiW++){
	                	float dX= iiW*(dW/LOD_CALC_SAMPLES);
                        start.set		(X+dX,Y+dY,0);
                        M.transform_tiny(start);
                        start.mad		(M.k,-dR);
                        PQ.prepare_rq	(start,M.k,d2R,CDB::OPT_CULL);
                        E->RayQuery		(PQ);
                        if (PQ.r_count()){
                            PQ.r_sort();
                            Fvector N	= {0,0,0};
                            for (s32 k=PQ.r_count()-1; k>=0; k--){
                            	SPickQuery::SResult* R = PQ.r_begin()+k;
								u32 	uA;
                            	if (!GetPointColor(R,uA)) continue;
                                float	fA = float(uA)/255.f;
								if (uA){
                                    Fvector  pt; 	pt.mad(PQ.m_Start,PQ.m_Direction,R->range-EPS_L);
                                    Fvector4 ptt;	ptt.set(pt.x,pt.y,pt.z,fA);
                                    sample_pt_vec.push_back(ptt);
                                }
                                // normal
                                Fvector Nn;
                                Nn.mknormal		(R->verts[0],R->verts[1],R->verts[2]);
                                Nn.mul			(fA);

                                N.mul			(1.f-fA);
                                N.add			(Nn);
                            }
                            float n_mag			= N.magnitude();
                            if (!fis_zero(n_mag,EPS))
                                n_vec.push_back	(N.div(n_mag));
                        }
                    }
                }
tN+=TT.Stop();

TT.Start();
                // light points
                float res_transp		= 0.f;
                for (Fvector4It pt_it=sample_pt_vec.begin(); pt_it!=sample_pt_vec.end(); pt_it++){
                    float avg_transp	= 0.f;
                    for (BLIt it=simple_hemi.begin(); it!=simple_hemi.end(); it++){
TT1.Start();
                        Fvector 		start;
                        start.mad		(Fvector().set(pt_it->x,pt_it->y,pt_it->z),it->light.direction,-dR);
                        PQ.prepare_rq	(start,it->light.direction,dR,CDB::OPT_CULL);
                        E->RayQuery		(PQ);
tR+=TT1.Stop();                             
                        float ray_transp= 1.f;
                        if (PQ.r_count()){
                            for (s32 k=0; k<PQ.r_count(); k++){
                                u32 	a;
TT1.Start();
                                if (!GetPointColor(PQ.r_begin()+k,a)) continue;
tT+=TT1.Stop();
                                ray_transp		*= (1.f - float(a)/255.f);
								if (fis_zero(ray_transp,EPS_L)) break;
                            }
                        }
                        avg_transp				+= ray_transp;
                    }
                    avg_transp					/= simple_hemi.size();
                    res_transp					= res_transp*(1.f-pt_it->w)+avg_transp*pt_it->w;
                }
tH+=TT.Stop();

				tgt_h				= iFloor	(res_transp*255.f);

                Fvector N={0,0,0};
                if (!n_vec.empty()){
                    for (FvectorIt it=n_vec.begin(); it!=n_vec.end(); it++) N.add(*it);
                    N.div			(n_vec.size());
	                N.normalize_safe();
	                Mi.transform_dir(N);
                }
                N.mul				(0.5f);
                N.add				(0.5f);
                N.mul				(255.f);
                tgt_n				= color_rgba(iFloor(N.x),iFloor(N.y),iFloor(N.z),src_a);
            }
        }
    }

	Msg("Normal: %3.2fsec, Hemi: %3.2f, PC: %3.2f, RP: %3.2f",tN,tH,tT,tR);
	ImageLib.ApplyBorders			(b.ndata,	LOD_IMAGE_SIZE*LOD_SAMPLE_COUNT,LOD_IMAGE_SIZE);
    // fill alpha to N-channel
    for (int px_idx=0; px_idx<int(b.ndata.size()); px_idx++)
        b.ndata[px_idx]				= subst_alpha(b.ndata[px_idx],hemi_temp[px_idx]);
    UI->ProgressEnd(PB);
*/    
    
    return l_lods.size()-1;
}
Beispiel #18
0
AsShader::AsShader(const char** pShaderSource, GLenum pType): mShaderType(pType)
{
    mShaderID = glCreateShader(mShaderType);

	mBuildLog = BuildShader(pShaderSource, pType);
}