Beispiel #1
0
shader_program::shader_program(const std::string &vsrc, const std::string &fsrc)
	: program_object_(0)
	, vertex_object_(0)
	, fragment_object_(0)
	, block_()
	, attr_color_mod_(0)
	, attr_submerge_(0)
	, attr_effects_(0)
	, uni_overlay_(0)
	, overlay_image_()
	, refcount_(new unsigned(1))
{
	vertex_object_ = GPU_LoadShader(GPU_VERTEX_SHADER, vsrc.c_str());
	if (!vertex_object_) {
		throw shader_error("Failed to compile vertex shader");
	}

	fragment_object_ = GPU_LoadShader(GPU_FRAGMENT_SHADER, fsrc.c_str());
	if (!fragment_object_) {
		throw shader_error("Failed to compile fragment shader");
	}

	program_object_ = GPU_LinkShaders(vertex_object_, fragment_object_);
	if (!program_object_) {
		throw shader_error("Failed to link shader program");
	}

	attr_color_mod_ = GPU_GetAttributeLocation(program_object_,
											   "vert_color_mod");
	attr_submerge_ = GPU_GetAttributeLocation(program_object_,
											  "vert_submerge");
	attr_effects_ = GPU_GetAttributeLocation(program_object_,
											 "vert_effects");
	uni_overlay_ = GPU_GetUniformLocation(program_object_, "overlay");

	set_color_mod(0, 0, 0, 0);
	set_submerge(0);
	set_effects(0);
}
Beispiel #2
0
int main(int argc, char* argv[])
{
	GPU_Target* screen;

	GPU_SetDebugLevel(GPU_DEBUG_LEVEL_MAX);
    SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE);

	GPU_SetRequiredFeatures(GPU_FEATURE_BASIC_SHADERS);
	screen = GPU_InitRenderer(GPU_RENDERER_OPENGL_3, 800, 600, GPU_DEFAULT_INIT_FLAGS);
	if(screen == NULL)
    {
        GPU_LogError("Initialization Error: Could not create a renderer with proper feature support for this demo.\n");
		return 1;
    }
    
    glewExperimental = GL_TRUE;  // Force GLEW to get exported functions instead of checking via extension string
    if(glewInit() != GLEW_OK)
    {
        GPU_LogError("Initialization Error: Failed to initialize GLEW.\n");
        return 2;
    }

	{
		GPU_Image* image;
		float dt;
		Uint32 startTime;
		long frameCount;
		int maxSprites = 50;
		int numSprites;
		float x[50];
		float y[50];
		float velx[50];
		float vely[50];
		int i;
		Uint8 done;
		SDL_Event event;

		image = GPU_LoadImage("data/test.bmp");
		if (image == NULL)
			return 3;
        
        v = GPU_LoadShader(GPU_VERTEX_SHADER, "data/shaders/untextured-150.vert");
        f = GPU_LoadShader(GPU_FRAGMENT_SHADER, "data/shaders/untextured-150.frag");
        p = GPU_LinkShaders(v, f);
            
        GPU_Log("%s\n", GPU_GetShaderMessage());

        glUseProgram(p);
        vertex_loc = GPU_GetAttributeLocation(p, "gpu_Vertex");
        color_loc = GPU_GetAttributeLocation(p, "gpu_Color");
        modelViewProjection_loc = GPU_GetUniformLocation(p, "gpu_ModelViewProjectionMatrix");

        glGenVertexArrays(1, &VAO);
        glBindVertexArray(VAO);

        glGenBuffers(1, &VBO);
        glBindBuffer(GL_ARRAY_BUFFER, VBO);

		dt = 0.010f;

		startTime = SDL_GetTicks();
		frameCount = 0;

		numSprites = 1;

		for (i = 0; i < maxSprites; i++)
		{
			x[i] = rand() % screen->w;
			y[i] = rand() % screen->h;
			velx[i] = 10 + rand() % screen->w / 10;
			vely[i] = 10 + rand() % screen->h / 10;
		}


		done = 0;
		while (!done)
		{
			while (SDL_PollEvent(&event))
			{
				if (event.type == SDL_QUIT)
					done = 1;
				else if (event.type == SDL_KEYDOWN)
				{
					if (event.key.keysym.sym == SDLK_ESCAPE)
						done = 1;
					else if (event.key.keysym.sym == SDLK_EQUALS || event.key.keysym.sym == SDLK_PLUS)
					{
						if (numSprites < maxSprites)
							numSprites++;
					}
					else if (event.key.keysym.sym == SDLK_MINUS)
					{
						if (numSprites > 0)
							numSprites--;
					}
				}
			}

			for (i = 0; i < numSprites; i++)
			{
				x[i] += velx[i] * dt;
				y[i] += vely[i] * dt;
				if (x[i] < 0)
				{
					x[i] = 0;
					velx[i] = -velx[i];
				}
				else if (x[i]> screen->w)
				{
					x[i] = screen->w;
					velx[i] = -velx[i];
				}

				if (y[i] < 0)
				{
					y[i] = 0;
					vely[i] = -vely[i];
				}
				else if (y[i]> screen->h)
				{
					y[i] = screen->h;
					vely[i] = -vely[i];
				}
			}

			GPU_Clear(screen);

			draw_3d_stuff(screen);

			for (i = 0; i < numSprites; i++)
			{
				GPU_Blit(image, NULL, screen, x[i], y[i]);
			}

			draw_more_3d_stuff(screen);

			GPU_Flip(screen);

			frameCount++;
			if (frameCount % 500 == 0)
				printf("Average FPS: %.2f\n", 1000.0f*frameCount / (SDL_GetTicks() - startTime));
		}

		printf("Average FPS: %.2f\n", 1000.0f*frameCount / (SDL_GetTicks() - startTime));

		GPU_FreeImage(image);
	}

	GPU_Quit();
	
	return 0;
}