Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何获取片段着色器的坐标?gl_FragCoord不工作_Java_Opengl_Glsl_Shader_Lwjgl - Fatal编程技术网

Java 如何获取片段着色器的坐标?gl_FragCoord不工作

Java 如何获取片段着色器的坐标?gl_FragCoord不工作,java,opengl,glsl,shader,lwjgl,Java,Opengl,Glsl,Shader,Lwjgl,我正在尝试制作一个Mandelbrot集合资源管理器,它将根据窗口中的坐标对屏幕上的像素进行着色。我以前在不使用着色器的情况下做过这件事,但速度非常慢。我不知道如何获得片段的位置,以便使用我已经开发的算法渲染Mandelbrot集 我用的是LJGL3。我整天都在研究如何做到这一点,但我找不到任何关于如何获得坐标的全面发现。看起来gl_FragCoord应该可以工作,然后我可以使用gl_FragCoord.x和gl_FragCoord.y来获得x和y值,这就是我所需要的算法,但我的屏幕总是以红色结

我正在尝试制作一个Mandelbrot集合资源管理器,它将根据窗口中的坐标对屏幕上的像素进行着色。我以前在不使用着色器的情况下做过这件事,但速度非常慢。我不知道如何获得片段的位置,以便使用我已经开发的算法渲染Mandelbrot集

我用的是LJGL3。我整天都在研究如何做到这一点,但我找不到任何关于如何获得坐标的全面发现。看起来gl_FragCoord应该可以工作,然后我可以使用gl_FragCoord.x和gl_FragCoord.y来获得x和y值,这就是我所需要的算法,但我的屏幕总是以红色结束。我不会将任何信息从顶点着色器传递到片段着色器中,因为我需要根据其x和y值渲染Mandelbrot中每个坐标的颜色,因此顶点位置没有帮助(我也不知道如何获得这些)

这是我的片段着色器:

    in vec4 gl_FragCoord;
    uniform vec2 viewportDimensions;
    uniform float minX;
    uniform float maxX;
    uniform float minY;
    uniform float maxY;

    vec3 hsv2rgb(vec3 c){
        vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0);
        vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www);
        return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y);
    }

    void main(){
        float x = gl_FragCoord.x;
        float y = gl_FragCoord.y;

        vec2 c = vec2((x* (maxX-minX) / viewportDimensions.x + minX), (y*(maxY-minY)/ viewportDimensions.y + minY));
        vec2 z = c;

        float limit = 1000;
        float iterations = 0;
        for(int i = 0; i < int(limit); i++){
            float t = 2.0 * z.x * z.y + c.y;
            z.x = z.x * z.x - z.y * z.y + c.x;
            z.y = t;

            if(z.x * z.x + z.y *z.y > 4){
                break;
            }

            iterations += 1.0;
        }
        float itRGB = iterations/limit;
        vec3 hsv = vec3(itRGB, 1.0, 1.0);
        vec3 rgb = hsv2rgb(hsv);
        gl_FragColor = vec4(rgb, 1);
    }
以及我的客户代码的相关部分:

    glBegin(GL_POLYGON);
                glVertex2f(-1f, -1f);
                glVertex2f(1f, -1f);
                glVertex2f(1f, 1f);
                glVertex2f(-1f, 1f);
    glEnd();
这是在我的窗口循环中运行的,只是在mandelbrot应该渲染的地方创建了一个正方形

这是我的工作java Mandelbrot程序的输出,该程序不使用着色器:

这是我的着色器程序的输出:

全屏:

我也不知道如何在没有黑条的情况下正确调整窗口的大小。我试图在上面的代码中使用vec2 c来实现这一点,因为我已经将制服设置为窗口的高度和宽度,并在将坐标映射到复数平面时使用它,但由于gl_FragCoord似乎不起作用,因此也不应该这样做。如果能链接到基于glfwCreateWindow的当前lgjwl屏幕大小调整指南,我们将不胜感激。

是一个内置的输入变量,无需声明输入变量
gl\u FragCoord
x
y
坐标是窗口(像素)坐标。
左下角为(0.5,0.5),右上角为(W-0.5,H-0.5),其中W和H是视口的宽度和高度

您必须将
gl\u FragCoord.x
映射到范围[
minX
maxX
]和
gl\u FragCoord.y
映射到范围[
minY
maxy

为此,我向我们推荐GLSL功能。
viewportDimensions
假定包含窗口(像素)坐标中视口矩形的宽度和高度

vec2 c=mix(vec2(minX,minY),vec2(maxX,maxY),gl_FragCoord.xy/viewportDimensions.xy);
请参见(WebGL)示例,在该示例中,我将建议应用于问题的片段着色器。
边界初始化如下

minX=-2.5
minY=-2.0
maxX=1.5
最大值=2.0

(函数loadscene(){
变量画布,gl,vp_大小,prog,bufObj={};
函数initScene(){
canvas=document.getElementById(“ogl画布”);
gl=canvas.getContext(“实验性webgl”);
如果(!gl)
返回;
progDraw=gl.createProgram();
for(设i=0;i<2;++i){
让source=document.getElementById(i==0?“绘制着色器vs”:“绘制着色器fs”).text;
让shaderObj=gl.createShader(i==0?gl.VERTEX\u着色器:gl.FRAGMENT\u着色器);
gl.shaderSource(shaderObj,source);
总编编辑主任(shaderObj);
let status=gl.getShaderParameter(shaderObj,gl.COMPILE_status);
如果(!状态)警报(gl.getShaderInfoLog(shaderObj));
总承包商attachShader(progDraw,shaderObj);
总账链接程序(progDraw);
}
status=gl.getProgramParameter(progDraw,gl.LINK\u status);
如果(!状态)警报(总账getProgramInfoLog(progDraw));
progDraw.inPos=gl.getAttribLocation(progDraw,“inPos”);
progDraw.minX=gl.getUniformLocation(progDraw,“minX”);
progDraw.maxX=gl.getUniformLocation(progDraw,“maxX”);
progDraw.minY=gl.getUniformLocation(progDraw,“minY”);
progDraw.maxY=gl.getUniformLocation(progDraw,“maxY”);
progDraw.viewportDimensions=gl.getUniformLocation(progDraw,“viewportDimensions”);
总账使用程序(progDraw);
var pos=[-1,-1,1,-1,1,1,1];
var inx=[0,1,2,0,2,3];
bufObj.pos=gl.createBuffer();
gl.bindBuffer(gl.ARRAY\u BUFFER,bufObj.pos);
总账缓冲数据(总账数组缓冲区、新Float32Array(pos)、总账静态绘图);
bufObj.inx=gl.createBuffer();
bufObj.inx.len=inx.length;
gl.bindBuffer(gl.ELEMENT\u ARRAY\u BUFFER,bufObj.inx);
gl.bufferData(gl.ELEMENT\u ARRAY\u BUFFER、新UINT16阵列(inx)、gl.STATIC\u DRAW);
gl.EnableVertexAttributeArray(progDraw.inPos);
gl.VertexAttributePointer(progDraw.inPos,2,gl.FLOAT,false,0,0);
总帐启用(总帐深度测试);
gl.clearColor(0.0,0.0,0.0,1.0);
window.onresize=调整大小;
调整大小();
请求动画帧(渲染);
}
函数resize(){
//vp_大小=[gl.drawingBufferWidth,gl.drawingBufferHeight];
vp_size=[window.innerWidth,window.innerHeight];
//vp_大小=[256,256]
canvas.width=vp_大小[0];
canvas.height=vp_大小[1];
}
函数渲染(deltaMS){
总图视口(0,0,canvas.width,canvas.height);
gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
gl.uniform1f(progDraw.minX,-2.5);
gl.uniform1f(progDraw.minY,-2.0);
gl.uniform1f(progDraw.maxX,1.5);
gl.uniform1f(progDraw.maxY,2.0);
gl.uniform2f(progDraw.viewportDimensions、canvas.width、canvas.height);
总帐付款人(总帐三角形,bufObj.inx.len,总帐无符号_短,0);
请求动画帧(渲染);
}  
初始化场景();
})();
html,正文{边距:0;溢出:隐藏;}

精密中泵浮子;
属性向量2-inPos;
void main()
{
gl_位置=vec4(inPos.xy,0.0,1.0);
}
精密中泵浮子;
统一的vec2视口尺寸;
均匀浮动minX;
均匀浮动maxX;
均匀浮点数
    glBegin(GL_POLYGON);
                glVertex2f(-1f, -1f);
                glVertex2f(1f, -1f);
                glVertex2f(1f, 1f);
                glVertex2f(-1f, 1f);
    glEnd();