我的目標是將一個點數組傳遞給着色器,計算它們到片段的距離並用一個帶有漸變色的圓圈繪製它們,具體取決於該計算。統一點陣列和管理片段着色器座標系統
例如:
(從working example I set up on shader toy)
不幸的是,我不清楚我應該如何計算並通過轉換處理着色器內的座標。
我目前正在嘗試的是通過兩個浮點數組 - 一個用於x位置,一個用於每個點的y位置 - 通過統一着色器。然後着色器內通過每個點重複,像這樣:
#ifdef GL_ES
precision mediump float;
precision mediump int;
#endif
uniform float sourceX[100];
uniform float sourceY[100];
uniform vec2 resolution;
in vec4 gl_FragCoord;
varying vec4 vertColor;
varying vec2 center;
varying vec2 pos;
void main()
{
float intensity = 0.0;
for(int i=0; i<100; i++)
{
vec2 source = vec2(sourceX[i],sourceY[i]);
vec2 position = (gl_FragCoord.xy/resolution.xy);
float d = distance(position, source);
intensity += exp(-0.5*d*d);
}
intensity=3.0*pow(intensity,0.02);
if (intensity<=1.0)
gl_FragColor=vec4(0.0,intensity*0.5,0.0,1.0);
else if (intensity<=2.0)
gl_FragColor=vec4(intensity-1.0, 0.5+(intensity-1.0)*0.5,0.0,1.0);
else
gl_FragColor=vec4(1.0,3.0-intensity,0.0,1.0);
}
但是,這並不工作 - 我相信這可能是因爲我努力工作,與像素不正確轉換這些座標。任何人都可以向我解釋如何使這項工作?
更新:
目前的結果是: 草圖的代碼是:
PShader pointShader;
float[] sourceX;
float[] sourceY;
void setup()
{
size(1024, 1024, P3D);
background(255);
sourceX = new float[100];
sourceY = new float[100];
for (int i = 0; i<100; i++)
{
sourceX[i] = random(0, 1023);
sourceY[i] = random(0, 1023);
}
pointShader = loadShader("pointfrag.glsl", "pointvert.glsl");
shader(pointShader, POINTS);
pointShader.set("sourceX", sourceX);
pointShader.set("sourceY", sourceY);
pointShader.set("resolution", float(width), float(height));
}
void draw()
{
for (int i = 0; i<100; i++) {
strokeWeight(60);
point(sourceX[i], sourceY[i]);
}
}
,而頂點着色器:
#define PROCESSING_POINT_SHADER
uniform mat4 projection;
uniform mat4 transform;
attribute vec4 vertex;
attribute vec4 color;
attribute vec2 offset;
varying vec4 vertColor;
varying vec2 center;
varying vec2 pos;
void main() {
vec4 clip = transform * vertex;
gl_Position = clip + projection * vec4(offset, 0, 0);
vertColor = color;
center = clip.xy;
pos = offset;
}
你能就如何爲「不工作」展開?除了不處理點比例或視口寬高比外,沒有任何東西看起來立即錯誤。事實上,我不確定統一陣列的數量是否有限制。你如何設定他們的價值?你使用統一緩衝區嗎? – jozxyqk
忽略這一點,[設置一個統一的數組](http://stackoverflow.com/a/8100273/1888983)是好的,它看起來像你不會用完[至少1024](https:/ /www.opengl.org/wiki/Uniform_(GLSL)),但你可能想看看統一的緩衝區對象。 – jozxyqk
感謝您的回覆,問題在於着色器將所有圈子繪製爲黑色。從我所能得到的結果來看,d的價值存在一些問題。下面是我得到的結果:[Image](http://i.imgur.com/TIZ0TIq.png) – Giuseppe