gpt4 book ai didi

使用着色器绘制抗锯齿圆

转载 作者:行者123 更新时间:2023-12-01 22:57:00 25 4
gpt4 key购买 nike

我是着色器编程新手。我正在尝试用 glsl 画一个圆。我使用了一个具有 Size 的点,并尝试过滤掉半径之外的点。(改变 alpha 值)。代码如下:

片段着色器:

#version 130
varying vec2 textureCoordinate;
const float circleBorderWidth = 0.08;//for anti aliasing
void main() {
float d = smoothstep(circleBorderWidth,0.1, 1.0-length(textureCoordinate));
gl_FragColor = vec4(0.0, 1.0, 0.0, d);
}

顶点着色器:

#version 130
attribute vec4 coord3d;
attribute vec2 varPos;
varying vec2 textureCoordinate;
void
main()
{
textureCoordinate = varPos;
gl_FrontColor = gl_Color;
gl_Position = vec4(coord3d.xyz,1.);
gl_PointSize = coord3d.w;
}

数据:

float pos[] = {
-1, -1,
-1, 1,
1, 1,
1, -1,
};

float vertices[]={0.0,0.0f,0.0f,100.0f};

绘制方法:

void drawScene() {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
program->makeCurrent();
glEnable(GL_POINT_SMOOTH);
glEnable(GL_VERTEX_PROGRAM_POINT_SIZE);
glEnable(GL_BLEND);
glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

if (varPosAttrib>=0) {
glVertexAttribPointer( varPosAttrib, 2, GL_FLOAT, GL_FALSE,
0, pos ); // -->varPos in Vertex Shader.
glEnableVertexAttribArray( varPosAttrib );
}

if (posAttrib>=0) {
glVertexAttribPointer(posAttrib, 4, GL_FLOAT, GL_FALSE, 0, vertices); // -->coord3d in vertex shader
glEnableVertexAttribArray(posAttrib);
glDrawArrays(GL_POINTS, 0, 1);
}
glDisable(GL_POINT_SMOOTH);
glDisable(GL_VERTEX_PROGRAM_POINT_SIZE);
glDisable(GL_BLEND);
program->release();
glutSwapBuffers(); //Send the 3D scene to the screen
}

如果我在下面的行中(在片段着色器中)将 d 替换为 1.0,则会绘制一个正方形:

gl_FragColor = vec4(0.0, 1.0, 0.0, d); // -> if d is replaced by 1.0

我尝试将 gl_FragColor 中的 x 和 y 值替换为 textureCooperative.xtextureCooperative.y。结果是黑色(所以我假设值为 0.0)。我不明白的是,如果我采用textureCooperative的长度,它总是1.0。(通过替换gl_fragcolor中的值进行实验)。我无法弄清楚我在这里做错了什么。我期望 textureCooperative 值根据传入的数据 (varPos) 进行插值。

最佳答案

这是我目前的尝试。它的工作原理是,它绘制了一个具有平滑边框的圆盘。我使用距离场方法,即。我计算距光盘边界的距离

片段着色器

#version 110

varying vec2 uv;

void
main() {
float border = 0.01;
float radius = 0.5;
vec4 color0 = vec4(0.0, 0.0, 0.0, 1.0);
vec4 color1 = vec4(1.0, 1.0, 1.0, 1.0);

vec2 m = uv - vec2(0.5, 0.5);
float dist = radius - sqrt(m.x * m.x + m.y * m.y);

float t = 0.0;
if (dist > border)
t = 1.0;
else if (dist > 0.0)
t = dist / border;

gl_FragColor = mix(color0, color1, t);
}

顶点着色器

#version 110

varying vec2 uv;

void
main() {
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
uv = vec2(gl_MultiTexCoord0);
}

它应该在纹理坐标为 (-0.5, -0.5)x(0.5, 0.5) 的四边形上绘制

关于使用着色器绘制抗锯齿圆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12945277/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com