
vertices = {
0, 0, 0, // позиция
1, 1, // текстурни координати
0, 1, 0, // нормала
...
};
SetVertexBuffer(vertices, vertices.size() * 8 * sizeof(float));
SetVertexFormat(POSITION | TEXCOORD | NORMAL);
SetIndexBuffer({0,1,2,0,2,3...});
SetLightPos({2,4,7});
SetEyePos({sin(t),0,cos(t)}); // върти камера
SetTexture(someTexture);
Draw(TRIANGLES);
Fixed pipeline: функция за всичко :(
vertices = {0, 0, 0, 1, 1, 0, 1, 0, ...};
auto stride = 8*sizeof(float);
SetVertexBuffer(vertices, vertices.size() * stride);
SetAttribPointer("aPosition", 0, FLOAT3, stride);
SetAttribPointer("aTC", 3*sizeof(float), FLOAT2, stride);
SetAttribPointer("aNormal", 5*sizeof(float), FLOAT3, stride);
UseVertexShader(vsCode);
UseFragmentShader(fsCode);
SetUniform("uView", viewMatrix);
SetUnirorm("uTexture", someTexture);
SetUniform("uLightPos", {2,4,7});
SetIndexBuffer({0,1,2,0,2,3...});
Draw(TRIANGLES);
attribute vec4 aPos;
uniform mat4 uCam;
void main() {
gl_Position = uCam * aPos;
}
void main() {
gl_FragColor = vec4(0, 0.9, 0.3, 1);
}
uniform vec4 uColor;
void main() {
gl_FragColor = uColor;
}
attribute vec4 aPos;
attribute vec2 aTexCoord;
attribute vec3 aNormal;
uniform mat4 uCam;
uniform vec3 uLightPos;
varying vec2 vTexCoord;
varying vec3 vNormal;
varying vec3 vLightDir;
void main() {
vTexCoord = aTexCoord;
vNormal = aNormal;
vLightDir = uLightPos - aPos.xyz;
gl_Position = uCam * aPos;
}
attribute vec4 aPos;
varying vec2 vTexCoord;
varying vec3 vNormal;
varying vec3 vLightDir;
uniform sampler2D uDiffuse;
void main() {
float shade = dot(normalize(vNormal), normalize(vLightDir));
shade = saturate(shade);
vec4 color = texture2D(uDiffuse, vTexCoord);
gl_FragColor = vec4(color.xyz * shade, 1);
}
Хм... цветове и вектори са едно и също?
//...
attribute vec3 aNormal;
attribute vec3 aTangent;
attribute vec3 aBitangent; // optional
uniform vec3 uLightPos;
varying vec3 vSSLightDir; // SS = surface space
void main() {
mat3 tbn = mat3(
aTangent,
aBitangent /* cross(aNormal, aTangent) */,
aNormal);
vec3 lightDir = uLightPos - aPos.xyz;
vSSLightDir = lightDir * tbn;
//...
}
// ...
vec3 ssNormal = normalize(2.0 * texture2D(uNormalMap, vTexCoord).xyz - 1.0);
float shade = dot(ssNormal, normalize(vSSLightDir));
// и всичко е както преди
// ...
__kernel void avg_blur(__global float* result, __global float* input)
{
int x = get_global_id(0), y = get_global_id(1);
int n = y*get_global_size(0) + x;
int local_size = get_local_size(1) * get_local_size(0);
int ln = get_local_id(1)*get_local_size(0) + get_local_id(0)
__local accum[local_size];
accum[ln] = input[n];
barrier(CLK_LOCAL_MEM_FENCE); // --------------------
result[i] = 0;
for(int i=0; i<local_size; ++i)
result[i] += accum[i];
result[i] /= local_size;
}
Но ако имаме еднакви операции върху голямо количество данни,
най-вероятно ще спечелим!
Борислав Станимиров / ibob.github.io / @stanimirovb
Тази презентация е тук: http://ibob.github.io/slides/code4gpus-bg/
Презентацията е лицензирана с Creative Commons Признание 3.0
Лицензи на допълнителните материали Виж тук