当前位置:网站首页>API learning of OpenGL (2001) gltexgen

API learning of OpenGL (2001) gltexgen

2022-07-06 10:36:00 hankern

Used to calculate texture coordinates .

opengl es 3.2 and opengl 4.5 This function is no longer supported , I don't know from which version it doesn't support .(This article describes legacy OpenGL APIs that have been removed from core OpenGL 3.1 and above (they are only deprecated in OpenGL 3.0). It is recommended that you not use this functionality in your programs. Consider using the OpenGL Shading Language instead.  Mathematics of glTexGen - OpenGL Wikihttps://www.khronos.org/opengl/wiki/Mathematics_of_glTexGen

void glTexGenf(GLenum coord, GLenum pname, GLfloat param);
void glTexGenfv(GLenum coord, GLenum pname, GLfloat *param);
The first parameter specifies the texture axis , It can be GL_S,GL_T,GL_R or GL_Q. The second parameter must be GL_TEXTURE_SPHERE,GL_OBJECT_PLANE or GL_EYE_PLANE. The last parameter sets the method or mode of texture generation .glTexGen There are also corresponding GLint and GLdouble Pattern .

Parameters coord Must be GL_S、GL_T、GL_R or GL_Q
pname Parameter is GL_TEXTURE_GEN_MODE、GL_OBJECT_PLANE or GL_EYE_PLANE,
If it is GL_TEXTURE_GEN_MODE,param It's an integer , namely GL_OBJECT_PLANE,GL_EYE_PLANE,GL_SPHERE_MAP,GL_REFLECTION,GL_NORMAL_MAP One of ;
If pname Take other possible values ,param It's a pointer to an array .

GL_OBJECT_LINEAR

g = p1 xo + p2 yo + p3 zo + p4 wo

glTexGen(GL_S, GL_OBJECT_LINEAR, {ps0,ps1,ps2,ps3})
glTexGen(GL_T, GL_OBJECT_LINEAR, {pt0,pt1,pt2,pt3})

And the following are equivalent

vec4 sPlane = vec4(ps0,ps1,ps2,ps3);
vec4 tPlane = vec4(pt0,pt1,pt2,pt3);
kOutBaseTCoord.s = dot(vec4(POSITION, 1.0), sPlane);
kOutBaseTCoord.t = dot(vec4(POSITION, 1.0), tPlane);

GL_EYE_LINEAR
myEyePlane_S = VectorTimesMatrix(myPlane_S, InverseModelviewMatrix);
myEyePlane_T = VectorTimesMatrix(myPlane_T, InverseModelviewMatrix);
// Now that we have myEyePlane_S and myEyePlane_T...
for(i = 0; i < total; i++)
{
  myEyeVertex = MatrixTimesVector(ModelviewMatrix, myVertex[i]);
  myTexCoord[i].s = dot4D(myEyeVertex, myEyePlane_S);
  myTexCoord[i].t = dot4D(myEyeVertex, myEyePlane_T);
}

GL_SPHERE_MAP
for(i = 0; i < total; i++)
{
  myEyeVertex = MatrixTimesVector(ModelviewMatrix, myVertex[i]);
  myEyeVertex = Normalize(myEyeVertex);
  myEyeNormal = VectorTimesMatrix(myNormal[i], InverseModelviewMatrix);
  reflectionVector = myEyeVertex - myEyeNormal * 2.0 * dot3D(myEyeVertex, myEyeNormal);
  reflectionVector.z += 1.0;
  m = 1.0 / (2.0 * sqrt(dot3D(reflectionVector, reflectionVector)));
  // I am emphasizing that we write to s and t. Used to sample a 2D texture.
  myTexCoord[i].s = reflectionVector.x * m + 0.5;
  myTexCoord[i].t = reflectionVector.y * m + 0.5;
}

GL_REFLECTION_MAP
for(i = 0; i < total; i++)
{
  myEyeVertex = MatrixTimesVector(ModelviewMatrix, myVertex[i]);
  myEyeVertex = Normalize(myEyeVertex);
  myEyeNormal = VectorTimesMatrix(myNormal[i], InverseModelviewMatrix);
  dotResult = 2.0 * dot3D(myEyeVertex, myEyeNormal);
  // I am emphasizing that we write to s and t and r. Used to sample a cubemap.
  myTexCoord[i].s = myEyeVertex.x - myEyeNormal.x * dotResult;
  myTexCoord[i].t = myEyeVertex.y - myEyeNormal.y * dotResult;
  myTexCoord[i].r = myEyeVertex.z - myEyeNormal.z * dotResult;
}

原网站

版权声明
本文为[hankern]所创,转载请带上原文链接,感谢
https://yzsam.com/2022/02/202202131709023887.html