我正在用Java开发一个简单的3D游戏引擎。我在照明方面遇到了问题:
我目前正在计算每个三角形的每个顶点的颜色,但是我仅以一种纯色(任何顶点的颜色)渲染三角形。我过去使用过OpenGL,我知道片段着色器会根据来自顶点着色器的信息(即位置和法线)来计算片段的颜色。那么,基本上,它如何“内插”值?示例:https://www.youtube.com/watch?v=bcxX0R8nnDs。我可能只是不明白它是如何工作的,但这就是我记得它是如何工作的...
如何使用以下信息实现这种事情:
我的不同尝试:
在当前三角形的每个像素(x; y)处执行的代码:
顶点是三角形的3个顶点的列表。 亮度是三角形的三个顶点的亮度(介于0和1之间)的列表 color是三角形的颜色。
float[] distances = new float[3];
// calculate the distances from each vertex to the current pixel
for (int c = 0; c < 3; c++) {
distances[c] = (float) (Math.sqrt(Math.pow(x - this.vertices[c].x, 2) + Math.pow(y - this.vertices[c].y, 2)));
}
float brightness = 0;
// Set the brightness of the pixel to the brightness of the closest vertex
if (distances[0] < distances[1] && distances[0] < distances[2]) { brightness = brightnesses[0]; }
else if (distances[1] < distances[0] && distances[1] < distances[2]) { brightness = brightnesses[1]; }
else if (distances[2] < distances[0] && distances[2] < distances[1]) { brightness = brightnesses[2]; }
if (brightness != 0) {
int newR = (int) (color.getRed() * brightness);
int newG = (int) (color.getGreen() * brightness);
int newB = (int) (color.getBlue() * brightness);
g.setColor(new Color(newR, newG, newB));
g.fillRect(x, y, 1, 1);
}
上面的代码是我的第一次尝试:之所以保留它,是因为它仍然有效并且总比没有好。