opengl片段着色器如何对每个顶点的颜色进行插值以获得单个像素的颜色?

时间:2019-04-02 17:59:08

标签: java opengl rendering fragment-shader

我正在用Java开发一个简单的3D游戏引擎。我在照明方面遇到了问题:

我目前正在计算每个三角形的每个顶点的颜色,但是我仅以一种纯色(任何顶点的颜色)渲染三角形。我过去使用过OpenGL,我知道片段着色器会根据来自顶点着色器的信息(即位置和法线)来计算片段的颜色。那么,基本上,它如何“内插”值?示例:https://www.youtube.com/watch?v=bcxX0R8nnDs。我可能只是不明白它是如何工作的,但这就是我记得它是如何工作的...

如何使用以下信息实现这种事情:

  • 应渲染的像素的当前2D像素坐标
  • 当前三角形每个顶点的当前颜色或亮度
  • 三角形的颜色

我的不同尝试:

  • 使用最近的顶点的像素亮度(可以,但是每个像素没有不同的颜色值。
  • 和一种算​​法,该算法尝试获取从每个顶点进入的光量及其距离和所有距离的总和。 (根本没用)

在当前三角形的每个像素(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);
}

上面的代码是我的第一次尝试:之所以保留它,是因为它仍然有效并且总比没有好。

0 个答案:

没有答案