我有一个顶点/片段着色器,它绘制一个矩形,根据纹理执行许多计算.(它混合像素,修改它们等).问题是每个矩形及其包含的像素不会改变.我只移动整个矩形并缩放它们.
有没有办法优化片段着色器,因为矩形不需要重新计算?
我无法成功运行着色器,我似乎错过了一些让它全部工作的步骤.我最终得到的错误是:
Exception in thread "main" org.lwjgl.opengl.OpenGLException: Invalid operation (1282)
at org.lwjgl.opengl.Util.checkGLError(Util.java:59)
at org.lwjgl.opengl.GL20.glUniform1i(GL20.java:374)
at sprites.Sprite.draw(Sprite.java:256)
at gui.Game.drawFrame(Game.java:238)
at gui.Game.gameLoop(Game.java:205)
at gui.Game.startGame(Game.java:244)
at tests.simple.SimpleShader.main(SimpleShader.java:36)
Run Code Online (Sandbox Code Playgroud)
我的初始化开始于:
int frag = FilterLoader.createShader("/tests/resources/shaders/grayscale.frag", GL20.GL_FRAGMENT_SHADER);
Run Code Online (Sandbox Code Playgroud)
并且createShader方法如下所示:
int shader = GL20.glCreateShader(type);
if(shader == 0)
return 0;
StringBuilder code = new StringBuilder("");
String line;
try
{
String path = FilterLoader.class.getResource(filename).getPath();
BufferedReader reader = new BufferedReader(new FileReader(path));
while((line = reader.readLine()) != null)
{
code.append(line + "\n");
}
}
catch(Exception e)
{
e.printStackTrace();
System.err.println("Error reading in " + type + …Run Code Online (Sandbox Code Playgroud) 我想使用多重采样纹理。
什么是片段着色器以及如何将多个采样器传递给着色器?
另外,哪个 API 可用于加载 texel 数据?
我想为此使用默认的 FBO。
我有3D体积纹理,我用下面的行初始化它:
glTexImage3D(GL_TEXTURE_3D, 0, GL_RED, numX, numY, numZ, 0, GL_RED, GL_UNSIGNED_BYTE, voldata);
Run Code Online (Sandbox Code Playgroud)
在片段着色器中,我想读取此纹理的值,但我无法用texture3d()函数读取.
下面的行在片段着色器中给出编译错误:(没有匹配为texture3d重载)
float value = texture3d(VolumeTexture,vec3(0.2f,0.2f,0.2f);
Run Code Online (Sandbox Code Playgroud)
如何从sampler3d获取数据?
OpenGLPart:
unsigned int texture;
glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_3D, texture);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_R, GL_REPEAT);
glTexImage3D(GL_TEXTURE_3D, 0, GL_RED, numX, numY, numZ, 0, GL_RED, GL_UNSIGNED_BYTE, voldata);
free(voldata ); //free the texture
...
display()
{
....
glActiveTexture(GL_TEXTURE0);
int texture_location = glGetUniformLocation(shader.id(), "VolumeTexture");
glUniform1i(texture_location, 0);
glBindTexture(GL_TEXTURE_3D,volumetext);
....
}
Run Code Online (Sandbox Code Playgroud)
我的片段着色器:
uniform sampler3D VolumeTexture;
void main()
{ …Run Code Online (Sandbox Code Playgroud) 我有一个3D网格.是否有可能像glClipPlaneOpenGL 一样渲染截面视图(剪切)?
我正在使用Three.js r65.
我添加的最新着色器是:
片段着色器:
uniform float time;
uniform vec2 resolution;
varying vec2 vUv;
void main( void )
{
vec2 position = -1.0 + 2.0 * vUv;
float red = abs( sin( position.x * position.y + time / 2.0 ) );
float green = abs( cos( position.x * position.y + time / 3.0 ) );
float blue = abs( cos( position.x * position.y + time / 4.0 ) );
if(position.x > 0.2 && position.y > 0.2 ) …Run Code Online (Sandbox Code Playgroud) 我正在使用我在另一个堆栈溢出问题中提供的着色器来渲染我的灰度屏幕:
import com.badlogic.gdx.graphics.glutils.ShaderProgram;
public class GrayscaleShader {
static String vertexShader = "attribute vec4 a_position;\n" +
"attribute vec4 a_color;\n" +
"attribute vec2 a_texCoord0;\n" +
"\n" +
"uniform mat4 u_projTrans;\n" +
"\n" +
"varying vec4 v_color;\n" +
"varying vec2 v_texCoords;\n" +
"\n" +
"void main() {\n" +
" v_color = a_color;\n" +
" v_texCoords = a_texCoord0;\n" +
" gl_Position = u_projTrans * a_position;\n" +
"}";
static String fragmentShader = "#ifdef GL_ES\n" +
" precision mediump float;\n" +
"#endif\n" +
"\n" +
"varying …Run Code Online (Sandbox Code Playgroud) 我有一个<canvas>由外部库写入的元素。我希望对此画布应用“后期制作”效果:我想(r,g,b,a) -> (r,g,b,a)在每个函数最终显示之前在每个像素上映射一个函数。
我知道外部库将写入从<canvas>元素获取的2D上下文。我也知道我要的转换是“像素着色器”或“片段着色器”。我知道我需要一个webgl上下文来应用这样的着色器。这个答案告诉我,画布不能同时具有多个上下文,因此我不确定这种方法是否可行。
我考虑的另一种方法是将画布的输出捕获为流,并在应用了转换的情况下将其写入新画布。但是,此功能仅在尖端的Firefox中存在。
是否可以将片段着色器应用于画布输出?如果是这样,怎么办?
我有一个旋转和移动的网格.我想只画一部分.
例如:
在我的WebGL游戏中,我有一个轨迹图网格,我只想显示红色圆圈中的部分(在左上角),其余的我不想绘制.
我应该考虑使用片段着色器吗?或者我可以以某种方式告诉轨迹图网格只绘制圆圈中的部分?
谢谢!
PS:如果我可以在圆圈周围淡出轨道地图而不是仅仅将其切掉,那将会很棒.:-)
我正在努力实现旧学校的电视效果.但是我很难找到一种扭曲屏幕边缘的好方法,这个例子就是你可以看到的效果.
我不是要求任何关于获得一个小故障或静态效果的东西.只是围绕屏幕边缘翘曲.我知道这绝对不可能只用普通的CSS.这可以在webGL或html5 Canvas中实现吗?
如果希望正常渲染,渲染最近的相机对象,则按如下方式设置OpenGL标志:
glDepthFunc(GL_LESS);
glEnable(GL_DEPTH_TEST);
Run Code Online (Sandbox Code Playgroud)
所以我认为这样做:
glDepthFunc(GL_GREATER);
glEnable(GL_DEPTH_TEST);
Run Code Online (Sandbox Code Playgroud)
也可以让我渲染距离相机最远的碎片.但是在设置这样的标志时我看不到输出.(我的申请没有进行任何其他修改)
如何渲染最远离相机的碎片?