示例#1
0
BoidRenderer::BoidRenderer(const BoidSystem& bs_, 
			   std::string vshader_fname,
			   std::string fshader_fname,
			   int width, 
			   int height)
	: bs(bs_), 
	  fov_angle_deg(60.0f),
	  near_plane(0.0625f),
	  far_plane(1024.0f),
	  vertex_shader_fname(vshader_fname),
	  fragment_shader_fname(fshader_fname)
{
	update_projection_matrix((float)width/height);

	// vertex buffer
	GLuint vb;
	glGenBuffers(1, &vb);
	vertex_buffer = vb;
	glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer);
	glBufferData(GL_ARRAY_BUFFER, 
		     bs.size()*3*sizeof(GL_FLOAT), 
		     NULL, GL_DYNAMIC_DRAW);

	if (!vertex_buffer) 
		throw std::runtime_error("failed to create vertex_buffer");

	vertex_shader = make_shader(
		GL_VERTEX_SHADER, vertex_shader_fname.c_str());
	if (!vertex_shader)
		throw std::runtime_error("failed to create vertex_shader");

	fragment_shader = make_shader(
		GL_FRAGMENT_SHADER, 
		fragment_shader_fname.c_str());
	if (!fragment_shader)
		throw std::runtime_error("failed to create fragment_shader");

	program = make_program(
		vertex_shader, fragment_shader);
	if (!program)
		throw std::runtime_error("failed to compile shader program");

	attributes.position = glGetAttribLocation(
		program, "position");
	if (attributes.position == -1)
		throw std::runtime_error("failed to find 'position' attribute in shader program");

	uniforms.pmatrix = glGetUniformLocation(
		program, "pmatrix");
	if (uniforms.pmatrix == -1)
		throw std::runtime_error("failed to find 'pmatrix' uniform in shader program");
	
	uniforms.mvmatrix = glGetUniformLocation(
		program, "mvmatrix");
	if (uniforms.mvmatrix == -1)
		throw std::runtime_error("failed to find 'mvmatrix' uniform in shader program");

}
示例#2
0
文件: camera.cpp 项目: jshrake/lexov
void camera::update_view_projection_matrix() const {
  if (projection_dirty || view_dirty) {
    if (projection_dirty) {
      update_projection_matrix();
    }
    if (view_dirty) {
      update_view_matrix();
    }
    view_projection = projection * view;
  }
}