示例#1
0
void Particle::init(){
  
  linkShader();
  
  initBuffers();
  
  GLuint gravity = glGetUniformLocation(program, "Gravity");
  GLuint plt = glGetUniformLocation(program, "ParticleLifetime");
  //GLuint ptex = glGetUniformLocation(program, "ParticleTex");
  
  glUniform1f(plt, 5.0f);
  //glUniform3f(gravity, 0.0f, -0.2f, 0.0f);
  
  angle = half_pi<float>();
  
  projection = mat4(1.0f);
  model = mat4(1.0f);
  view = lookAt(vec3(3.0f * cosf(angle), 1.5f, 3.0f * sinf(angle)), vec3(0.0f, 1.5f, 0.0f), vec3(0.0f, 1.0f, 0.0f));
  
  //  glUniform1f(gravity, 9.8);
  mat4 mvpMatrix(1.0f);
  
  starttimer = clock();
  
  glEnable(GL_BLEND);
  glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
}
示例#2
0
	void Model::Render(float elapsedTime)
	{
		glUseProgram(shader.GetProgram());

		glEnableVertexAttribArray(0);
		glEnableVertexAttribArray(1);
		glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), 0);
		glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), (const GLvoid*)12);

		glUniformMatrix4fv(mvpMatrixHandle, 1, GL_FALSE, (GLfloat*)&mvpMatrix(0, 0));
		glDrawElements(GL_TRIANGLES, indices.size(), GL_UNSIGNED_BYTE, 0);
	}
示例#3
0
// draw a zero to destination alpha
void AppLocal::DrawScreenMask( const ovrMatrix4f & mvp, const float fadeFracX, const float fadeFracY )
{
	Matrix4f mvpMatrix( mvp );

	glUseProgram( OverlayScreenFadeMaskProgram.program );

	glUniformMatrix4fv( OverlayScreenFadeMaskProgram.uMvp, 1, GL_FALSE, mvpMatrix.Transposed().M[0] );

	if ( FadedScreenMaskSquare.vertexArrayObject == 0 )
	{
		FadedScreenMaskSquare = BuildFadedScreenMask( fadeFracX, fadeFracY );
	}

	glColorMask( 0.0f, 0.0f, 0.0f, 1.0f );
	FadedScreenMaskSquare.Draw();
	glColorMask( 1.0f, 1.0f, 1.0f, 1.0f );
}
示例#4
0
// draw a zero to destination alpha
void DrawScreenMask( const ovrMatrix4f & mvp, const float fadeFracX, const float fadeFracY )
{
	OVR::Matrix4f mvpMatrix( mvp );

	static OVR::GlProgram prog;
	if ( !prog.program )
	{
		prog = OVR::BuildProgram(
			"uniform mat4 Mvpm;\n"
			"attribute vec4 VertexColor;\n"
			"attribute vec4 Position;\n"
			"varying  lowp vec4 oColor;\n"
			"void main()\n"
			"{\n"
			"   gl_Position = Mvpm * Position;\n"
			"   oColor = vec4( 1.0, 1.0, 1.0, 1.0 - VertexColor.x );\n"
			"}\n"
		,
			"varying lowp vec4	oColor;\n"
			"void main()\n"
			"{\n"
			"	gl_FragColor = oColor;\n"
			"}\n"
		);

	}
	glUseProgram( prog.program );

	glUniformMatrix4fv( prog.uMvp, 1, GL_FALSE, mvpMatrix.Transposed().M[0] );

	static OVR::GlGeometry	VignetteSquare;
	if ( VignetteSquare.vertexArrayObject == 0 )
	{
		VignetteSquare = BuildFadedScreenMask( fadeFracX, fadeFracY );
	}

	glColorMask( 0, 0, 0, 1 );
	VignetteSquare.Draw();
	glColorMask( 1, 1, 1, 1 );
}
示例#5
0
//--------------------------------------------------------------
// render the planet
void Planet::render(
  int graphicsWidth,
  int graphicsHeight,
  double angle)
{
  // if shader didn't compile, nothing we can do
  if (m_planetShader == 0)
    return;

  double atmos = 20.0;
  double radius = 1200.0;

  double eyeDist = m_eyePt.length()/radius;
  double a = 1.0;
  if (eyeDist < a)
    return;  // below surface, nothing to do 
  double b = sqrt(eyeDist*eyeDist - a*a);
  double h = (a*b)/eyeDist;
  double m = (a*a)/eyeDist;

  h += atmos/radius;

  // x axis from planet center towards eye
  mgPoint3 xaxis(m_eyePt);
  xaxis.normalize();

  // build y axis
  mgPoint3 yaxis(xaxis);
  yaxis.cross(mgPoint3(0.0, 1.0, 0.0));
  yaxis.normalize();

  mgPoint3 zaxis(yaxis);
  zaxis.cross(xaxis);
  zaxis.normalize();

  mgMatrix4 transform;
  transform._11 = xaxis.x;
  transform._12 = xaxis.y;
  transform._13 = xaxis.z;
  transform._21 = yaxis.x;
  transform._22 = yaxis.y;
  transform._23 = yaxis.z;
  transform._31 = zaxis.x;
  transform._32 = zaxis.y;
  transform._33 = zaxis.z;
  
  VertexPlanet tl, tr, bl, br;

  mgPoint3 pt;
  transform.mapPt(m, -h, h, pt.x, pt.y, pt.z);
  tl.setPoint(radius*pt.x, radius*pt.y, radius*pt.z);

  transform.mapPt(m, h, h, pt.x, pt.y, pt.z);
  tr.setPoint(radius*pt.x, radius*pt.y, radius*pt.z);

  transform.mapPt(m, -h, -h, pt.x, pt.y, pt.z);
  bl.setPoint(radius*pt.x, radius*pt.y, radius*pt.z);

  transform.mapPt(m, h, -h, pt.x, pt.y, pt.z);
  br.setPoint(radius*pt.x, radius*pt.y, radius*pt.z);

  // inverse of world transform
  mgMatrix4 model;
  model.rotateYDeg(-angle);

  mgPoint3 lightDir(1.0, 0.25, 0.0);
  lightDir.normalize();

  mgPoint3 modelLightDir;
  model.mapPt(lightDir, modelLightDir);
  transform.multiply(model);

  mgPoint3 modelEye; 
  transform.mapPt(eyeDist, 0.0, 0.0, modelEye.x, modelEye.y, modelEye.z);

  transform.mapPt(m, -h, h, pt.x, pt.y, pt.z);
  tl.setModelPoint(pt.x, pt.y, pt.z);

  transform.mapPt(m, h, h, pt.x, pt.y, pt.z);
  tr.setModelPoint(pt.x, pt.y, pt.z);

  transform.mapPt(m, -h, -h, pt.x, pt.y, pt.z);
  bl.setModelPoint(pt.x, pt.y, pt.z);

  transform.mapPt(m, h, -h, pt.x, pt.y, pt.z);
  br.setModelPoint(pt.x, pt.y, pt.z);

  mgMatrix4 viewMatrix;
  viewMatrix.translate(-m_eyePt.x, -m_eyePt.y, -m_eyePt.z);
  viewMatrix.multiply(m_eyeMatrix);

  mgMatrix4 worldProjection;
  createProjection(worldProjection, graphicsWidth, graphicsHeight);

  mgMatrix4 mvpMatrix(viewMatrix);
  mvpMatrix.multiply(worldProjection);

  setupShader(mvpMatrix, modelEye, modelLightDir);

  glActiveTexture(GL_TEXTURE0);
  glBindTexture(GL_TEXTURE_CUBE_MAP, m_surfaceTexture); 
  glActiveTexture(GL_TEXTURE1);
  glBindTexture(GL_TEXTURE_CUBE_MAP, m_cloudsTexture); 

  glBindVertexArray(m_vertexArray);
  glBindBuffer(GL_ARRAY_BUFFER, m_vertexBuffer);

  VertexPlanet data[6];
  data[0] = tl;
  data[1] = tr;
  data[2] = bl;
  data[3] = bl;
  data[4] = tr;
  data[5] = br;
  int vertexSize = sizeof(VertexPlanet);
  int count = 6;
  glBufferData(GL_ARRAY_BUFFER, vertexSize * count, data, GL_DYNAMIC_DRAW);

  glDrawArrays(GL_TRIANGLES, 0, count);

  glBindBuffer(GL_ARRAY_BUFFER, 0);
  glBindVertexArray(0);
  glActiveTexture(GL_TEXTURE0);
}
示例#6
0
//-----------------------------------------------------------------------------
// set standard variables for shader
void mgGL33Services::setShaderStdUniforms(
  mgShaderHandle shader)
{
  mgMatrix4 mvpMatrix(m_worldMatrix);
  mvpMatrix.multiply(m_worldProjection);

  GLint index;
  GLfloat matrix[16];

  CHECK_THREAD();
  index = glGetUniformLocation(shader, "mgMVPMatrix");
  if (index != -1)
  {
    matrix4toGL(mvpMatrix, matrix);
    glUniformMatrix4fv(index, 1, GL_FALSE, matrix);
  }

  index = glGetUniformLocation(shader, "mgMVMatrix");
  if (index != -1)
  {
    matrix4toGL(m_worldMatrix, matrix);
    glUniformMatrix4fv(index, 1, GL_FALSE, matrix);
  }

  index = glGetUniformLocation(shader, "mgModelMatrix");
  if (index != -1)
  {
    matrix4toGL(m_modelMatrix, matrix);
    glUniformMatrix4fv(index, 1, GL_FALSE, matrix);
  }

  index = glGetUniformLocation(shader, "mgNormalMatrix");
  if (index != -1)
  {
    normalMatrix(m_worldMatrix, matrix);
    glUniformMatrix3fv(index, 1, GL_FALSE, matrix);
  }

  index = glGetUniformLocation(shader, "mgVPMatrix");
  if (index != -1)
  {
    mgMatrix4 vpMatrix;
    vpMatrix.translate(-m_eyePt.x, -m_eyePt.y, -m_eyePt.z);
    vpMatrix.multiply(m_eyeMatrix);
    vpMatrix.multiply(m_worldProjection);
    matrix4toGL(vpMatrix, matrix);
    glUniformMatrix4fv(index, 1, GL_FALSE, matrix);
  }

  index = glGetUniformLocation(shader, "mgEyePt");
  if (index != -1)
  {
    glUniform3f(index, (GLfloat) m_eyePt.x, (GLfloat) m_eyePt.y, (GLfloat) m_eyePt.z);
  }

  // transform the light dir by eye matrix.  negate, since we want vector from point to light
  index = glGetUniformLocation(shader, "mgLightDir");
  if (index != -1)
  {
    mgPoint3 eyeLightDir;
    m_eyeMatrix.mapPt(m_lightDir, eyeLightDir);
    glUniform3f(index, (GLfloat) eyeLightDir.x, (GLfloat) eyeLightDir.y, (GLfloat) eyeLightDir.z);
  }

  index = glGetUniformLocation(shader, "mgLightColor");
  if (index != -1)
  {
    glUniform3f(index, (GLfloat) m_lightColor.x, (GLfloat) m_lightColor.y, (GLfloat) m_lightColor.z);
  }

  index = glGetUniformLocation(shader, "mgLightAmbient");
  if (index != -1)
  {
    glUniform3f(index, (GLfloat) m_lightAmbient.x, (GLfloat) m_lightAmbient.y, (GLfloat) m_lightAmbient.z);
  }

  index = glGetUniformLocation(shader, "mgMatColor");
  if (index != -1)
  {
    glUniform4f(index, (GLfloat) m_matColor.x, (GLfloat) m_matColor.y, (GLfloat) m_matColor.z, (GLfloat) m_matColor.w);
  }

  char varName[128];
  for (int unit = 0; ; unit++)
  {
    sprintf(varName, "mgTextureUnit%d", unit);
    index = glGetUniformLocation(shader, varName);
    if (index != -1)
      glUniform1i(index, unit);
    else break;
  }

  // vars up to date
  m_updateShaderVars = false;
}