📄 renderer.java
字号:
doLogo(gl);
}
void doMesh2TexelUnits(GL gl) {
float c[] = {0f, 0f, 0f, 1f}, // Holds Current Vertex
n[] = {0f, 0f, 0f, 1f}, // Normalized Normal Of Current Surface
s[] = {0f, 0f, 0f, 1f}, // s-Texture Coordinate Direction, Normalized
t[] = {0f, 0f, 0f, 1f}, // t-Texture Coordinate Direction, Normalized
l[] = {0f, 0f, 0f, 0f}, // Holds Our Lightposition To Be Transformed Into Object Space
Minv[] = new float[16]; // Holds The Inverted Modelview Matrix To Do So.
int i;
// Build Inverse Modelview Matrix First. This Substitutes One Push/Pop With One glLoadIdentity();
// Simply Build It By Doing All Transformations Negated And In Reverse Order.
gl.glLoadIdentity();
gl.glRotatef(-yrot, 0.0f, 1.0f, 0.0f);
gl.glRotatef(-xrot, 1.0f, 0.0f, 0.0f);
gl.glTranslatef(0.0f, 0.0f, -z);
gl.glGetFloatv(GL.GL_MODELVIEW_MATRIX, Minv, 0);
gl.glLoadIdentity();
gl.glTranslatef(0.0f, 0.0f, z);
gl.glRotatef(xrot, 1.0f, 0.0f, 0.0f);
gl.glRotatef(yrot, 0.0f, 1.0f, 0.0f);
// Transform The Lightposition Into Object Coordinates:
l[0] = lightPosition[0];
l[1] = lightPosition[1];
l[2] = lightPosition[2];
l[3] = 1.0f; // Homogenous Coordinate
VMatMult(Minv, l);
/* PASS#1: Texel-Unit 0: Use Texture "Bump"
No Blend
No Lighting
No Offset Texture-Coordinates
Texture-Operation "Replace"
Texel-Unit 1: Use Texture "Invbump"
No Lighting
Offset Texture Coordinates
Texture-Operation "Replace"
*/
// TEXTURE-UNIT #0
gl.glActiveTexture(GL.GL_TEXTURE0);
gl.glEnable(GL.GL_TEXTURE_2D);
gl.glBindTexture(GL.GL_TEXTURE_2D, bump[filter]);
gl.glTexEnvf(GL.GL_TEXTURE_ENV, GL.GL_TEXTURE_ENV_MODE, GL.GL_COMBINE);
gl.glTexEnvf(GL.GL_TEXTURE_ENV, GL.GL_COMBINE_RGB, GL.GL_REPLACE);
// TEXTURE-UNIT #1:
gl.glActiveTexture(GL.GL_TEXTURE1);
gl.glEnable(GL.GL_TEXTURE_2D);
gl.glBindTexture(GL.GL_TEXTURE_2D, invbump[filter]);
gl.glTexEnvf(GL.GL_TEXTURE_ENV, GL.GL_TEXTURE_ENV_MODE, GL.GL_COMBINE);
gl.glTexEnvf(GL.GL_TEXTURE_ENV, GL.GL_COMBINE_RGB, GL.GL_ADD);
// General Switches:
gl.glDisable(GL.GL_BLEND);
gl.glDisable(GL.GL_LIGHTING);
gl.glBegin(GL.GL_QUADS);
// Front Face
n[0] = 0.0f;
n[1] = 0.0f;
n[2] = 1.0f;
s[0] = 1.0f;
s[1] = 0.0f;
s[2] = 0.0f;
t[0] = 0.0f;
t[1] = 1.0f;
t[2] = 0.0f;
for (i = 0; i < 4; i++) {
c[0] = data[5 * i + 2];
c[1] = data[5 * i + 3];
c[2] = data[5 * i + 4];
SetUpBumps(n, c, l, s, t);
gl.glMultiTexCoord2f(GL.GL_TEXTURE0, data[5 * i], data[5 * i + 1]);
gl.glMultiTexCoord2f(GL.GL_TEXTURE1, data[5 * i] + c[0], data[5 * i + 1] + c[1]);
gl.glVertex3f(data[5 * i + 2], data[5 * i + 3], data[5 * i + 4]);
}
// Back Face
n[0] = 0.0f;
n[1] = 0.0f;
n[2] = -1.0f;
s[0] = -1f;
s[1] = 0.0f;
s[2] = 0.0f;
t[0] = 0.0f;
t[1] = 1.0f;
t[2] = 0.0f;
for (i = 4; i < 8; i++) {
c[0] = data[5 * i + 2];
c[1] = data[5 * i + 3];
c[2] = data[5 * i + 4];
SetUpBumps(n, c, l, s, t);
gl.glMultiTexCoord2f(GL.GL_TEXTURE0, data[5 * i], data[5 * i + 1]);
gl.glMultiTexCoord2f(GL.GL_TEXTURE1, data[5 * i] + c[0], data[5 * i + 1] + c[1]);
gl.glVertex3f(data[5 * i + 2], data[5 * i + 3], data[5 * i + 4]);
}
// Top Face
n[0] = 0.0f;
n[1] = 1.0f;
n[2] = 0.0f;
s[0] = 1.0f;
s[1] = 0.0f;
s[2] = 0.0f;
t[0] = 0.0f;
t[1] = 0.0f;
t[2] = -1.0f;
for (i = 8; i < 12; i++) {
c[0] = data[5 * i + 2];
c[1] = data[5 * i + 3];
c[2] = data[5 * i + 4];
SetUpBumps(n, c, l, s, t);
gl.glMultiTexCoord2f(GL.GL_TEXTURE0, data[5 * i], data[5 * i + 1]);
gl.glMultiTexCoord2f(GL.GL_TEXTURE1, data[5 * i] + c[0], data[5 * i + 1] + c[1]);
gl.glVertex3f(data[5 * i + 2], data[5 * i + 3], data[5 * i + 4]);
}
// Bottom Face
n[0] = 0f;
n[1] = -1f;
n[2] = 0f;
s[0] = -1f;
s[1] = 0f;
s[2] = 0f;
t[0] = 0f;
t[1] = 0f;
t[2] = -1f;
for (i = 12; i < 16; i++) {
c[0] = data[5 * i + 2];
c[1] = data[5 * i + 3];
c[2] = data[5 * i + 4];
SetUpBumps(n, c, l, s, t);
gl.glMultiTexCoord2f(GL.GL_TEXTURE0, data[5 * i], data[5 * i + 1]);
gl.glMultiTexCoord2f(GL.GL_TEXTURE1, data[5 * i] + c[0], data[5 * i + 1] + c[1]);
gl.glVertex3f(data[5 * i + 2], data[5 * i + 3], data[5 * i + 4]);
}
// Right Face
n[0] = 1.0f;
n[1] = 0.0f;
n[2] = 0.0f;
s[0] = 0.0f;
s[1] = 0.0f;
s[2] = -1.0f;
t[0] = 0.0f;
t[1] = 1.0f;
t[2] = 0.0f;
for (i = 16; i < 20; i++) {
c[0] = data[5 * i + 2];
c[1] = data[5 * i + 3];
c[2] = data[5 * i + 4];
SetUpBumps(n, c, l, s, t);
gl.glMultiTexCoord2f(GL.GL_TEXTURE0, data[5 * i], data[5 * i + 1]);
gl.glMultiTexCoord2f(GL.GL_TEXTURE1, data[5 * i] + c[0], data[5 * i + 1] + c[1]);
gl.glVertex3f(data[5 * i + 2], data[5 * i + 3], data[5 * i + 4]);
}
// Left Face
n[0] = -1.0f;
n[1] = 0.0f;
n[2] = 0.0f;
s[0] = 0.0f;
s[1] = 0.0f;
s[2] = 1.0f;
t[0] = 0.0f;
t[1] = 1.0f;
t[2] = 0.0f;
for (i = 20; i < 24; i++) {
c[0] = data[5 * i + 2];
c[1] = data[5 * i + 3];
c[2] = data[5 * i + 4];
SetUpBumps(n, c, l, s, t);
gl.glMultiTexCoord2f(GL.GL_TEXTURE0, data[5 * i], data[5 * i + 1]);
gl.glMultiTexCoord2f(GL.GL_TEXTURE1, data[5 * i] + c[0], data[5 * i + 1] + c[1]);
gl.glVertex3f(data[5 * i + 2], data[5 * i + 3], data[5 * i + 4]);
}
gl.glEnd();
/* PASS#2 Use Texture "Base"
Blend GL_DST_COLOR To GL_SRC_COLOR (Multiplies By 2)
Lighting Enabled
No Offset Texture-Coordinates
*/
gl.glActiveTexture(GL.GL_TEXTURE1);
gl.glDisable(GL.GL_TEXTURE_2D);
gl.glActiveTexture(GL.GL_TEXTURE0);
if (!embossEnabled) {
gl.glTexEnvf(GL.GL_TEXTURE_ENV, GL.GL_TEXTURE_ENV_MODE, GL.GL_MODULATE);
gl.glBindTexture(GL.GL_TEXTURE_2D, textures[filter]);
gl.glBlendFunc(GL.GL_DST_COLOR, GL.GL_SRC_COLOR);
gl.glEnable(GL.GL_BLEND);
gl.glEnable(GL.GL_LIGHTING);
doCube(gl);
}
xrot += xspeed;
yrot += yspeed;
if (xrot > 360.0f) xrot -= 360.0f;
if (xrot < 0.0f) xrot += 360.0f;
if (yrot > 360.0f) yrot -= 360.0f;
if (yrot < 0.0f) yrot += 360.0f;
/* LAST PASS: Do The Logos! */
doLogo(gl);
}
private void doMeshNoBumps(GL gl) {
gl.glLoadIdentity(); // Reset The View
gl.glTranslatef(0.0f, 0.0f, z);
gl.glRotatef(xrot, 1.0f, 0.0f, 0.0f);
gl.glRotatef(yrot, 0.0f, 1.0f, 0.0f);
gl.glActiveTexture(GL.GL_TEXTURE1);
gl.glDisable(GL.GL_TEXTURE_2D);
gl.glActiveTexture(GL.GL_TEXTURE0);
gl.glDisable(GL.GL_BLEND);
gl.glBindTexture(GL.GL_TEXTURE_2D, textures[filter]);
gl.glBlendFunc(GL.GL_DST_COLOR, GL.GL_SRC_COLOR);
gl.glEnable(GL.GL_LIGHTING);
doCube(gl);
xrot += xspeed;
yrot += yspeed;
if (xrot > 360.0f) xrot -= 360.0f;
if (xrot < 0.0f) xrot += 360.0f;
if (yrot > 360.0f) yrot -= 360.0f;
if (yrot < 0.0f) yrot += 360.0f;
/* LAST PASS: Do The Logos! */
doLogo(gl);
}
private void update() {
if (zoomOut)
z -= 0.02f;
if (zoomIn)
z += 0.02f;
if (decreaseX)
xspeed -= 0.01f;
if (increaseX)
xspeed += 0.01f;
if (increaseY)
yspeed += 0.01f;
if (decreaseY)
yspeed -= 0.01f;
}
public void display(GLAutoDrawable drawable) {
update();
GL gl = drawable.getGL();
gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);
if (bumpsEnabled) {
if (multitextureEnabled && maxTexelUnits[0] > 1)
doMesh2TexelUnits(gl);
else
doMesh1TexelUnits(gl);
} else
doMeshNoBumps(gl);
}
public void reshape(GLAutoDrawable drawable,
int xstart,
int ystart,
int width,
int height) {
GL gl = drawable.getGL();
height = (height == 0) ? 1 : height;
gl.glViewport(0, 0, width, height);
gl.glMatrixMode(GL.GL_PROJECTION);
gl.glLoadIdentity();
glu.gluPerspective(45, (float) width / height, 1, 1000);
gl.glMatrixMode(GL.GL_MODELVIEW);
gl.glLoadIdentity();
}
public void displayChanged(GLAutoDrawable drawable,
boolean modeChanged,
boolean deviceChanged) {
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -