小编Kev*_*lan的帖子

使用lwjgl将值从我的Java程序传递到GLSL

让我们说我有一个相当复杂的碎片着色器,用于确定每个像素有多少光:

//shaders/screen.frag
varying vec4 vertColor; //unlit color
float intensity = 1.0; //lighting intensity.

//parameters vary from material to material:
float roughness_rms; //root-mean-square roughness (um).
float peak_angle; //how steep peaks are on average.
/* more parameters */

void main(){
    /* complex shader code to calculate intensity */
    gl_FragColor = intensity*vertColor; //set the light strength
}
Run Code Online (Sandbox Code Playgroud)

以下是我初始化着色器的方法:

//something.java
import <needed crap>
int shader, fragShader;
shader=ARBShaderObjects.glCreateProgramObjectARB();
fragShader=createFragShader("shaders/screen.frag");
ARBShaderObjects.glAttachObjectARB(shader, fragShader);
ARBShaderObjects.glLinkProgramARB(shader);
ARBShaderObjects.glValidateProgramARB(shader);
Run Code Online (Sandbox Code Playgroud)

以及我如何使用它们:

//something.java
ARBShaderObjects.glUseProgramObjectARB(shader);
GL11.glBegin(GL11.GL_QUADS);
//etc.
Run Code Online (Sandbox Code Playgroud)

我的java代码计算rough_rms和其他参数形成各种材料.此外,当有子弹等影响时,这些参数会发生变化.我的问题是:如何在不重新生成整个着色器并重新编译它的情况下将变量从我的java传递到着色器语言(这将很慢).理想情况下,我绘制的每个四边形我都想更新着色器参数.

java opengl shader lwjgl

4
推荐指数
1
解决办法
3391
查看次数

zbuffer规则为gl_Position

这是我对opengl的设置,因为它们很重要:

glViewport(0,0,w,h); //w=800, h=600
glShadeModel(GL_SMOOTH);
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glClearDepth(1.0f);
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
Run Code Online (Sandbox Code Playgroud)

有一段时间我认为剪裁平面将适用于gl_Position.z在-1到1之外的任何东西.但即使我在着色器中强制gl_Position.z为常数:

gl_Position.z = -0.01;
Run Code Online (Sandbox Code Playgroud)

基于gl_Position.w仍然有正确的z缓冲和裁剪!那么规则是什么?

opengl zbuffer clipping

4
推荐指数
1
解决办法
5081
查看次数

如何在haxe中以宏模式获取导入列表?

如何获取宏模式下.hx文件使用的导入列表?更具体地讲,假设我有一个“ haxe.macro.Position”,它告诉我表达式属于哪个文件。我需要知道该文件用于将诸如“ Car”之类的删节类型声明转换为诸如“ vehicles.fourWheels.Car”之类的完整程序包路径类型的导入。

macros haxe

4
推荐指数
1
解决办法
257
查看次数

Java JTextArea允许滚动到文本末尾

Java的文本区域通常不允许滚动超出文本的末尾,但有时允许更舒适,即文本的底部位于窗口的中间.是否有捷径可寻?

java swing jtextarea

3
推荐指数
1
解决办法
133
查看次数

Java中对接口敏感的操作

这是我的整体工作流程.首先创建一个界面:

public interface foo {
   void bar(Baz b);
}
Run Code Online (Sandbox Code Playgroud)

然后制作一个包含所有实现所述接口的不同对象的向量:

myVector.add(new Ex);  //both Ex and Why implement foo.
myVector.add(new Why); 
Run Code Online (Sandbox Code Playgroud)

最后,使用界面:

for(int i=0; i<myVector.size(); i++) {
    myVector.get(i).bar(b);
}
Run Code Online (Sandbox Code Playgroud)

但是,由于显而易见的原因,这会产生编译时错误:

对于Object类型,方法bar()未定义

由于Ex和Why不相关,因此转换不起作用.尝试捕捉铸造到Ex然后为什么是一个可怕的解决方案.让Ex和Why扩展Bar_doers也听起来也不简洁,因为这会消除接口.

如何执行关心Object是否实现给定接口的操作,而不是对象是否属于给定类?

java interface

2
推荐指数
1
解决办法
64
查看次数

在java中同步"深入"?

让我们说你有:

public class Foo {
    public Bar b;
}
public class Bar {
    public int x;
    public int y;
}
Run Code Online (Sandbox Code Playgroud)

然后你打电话:

Foo f = new Foo();
....
synchronized(f) {
   f.b.x = 3;
   f.b.y = 5; //x and y must be adjacent primes at all times.
}
Run Code Online (Sandbox Code Playgroud)

如果我们的线程安全性很深?即同步(f)防止另一个线程(在它自己的同步(f)块内)在fb更新时看到fb?那么使用synchronized(this)呢?

java synchronization object

2
推荐指数
2
解决办法
150
查看次数

Clojure 一次重置多个原子

假设 foo 和 bar 是原子。

; consistent.
(reset! foo x)
; inconsistent x and y combination.
(reset! bar y)
; consistent.
Run Code Online (Sandbox Code Playgroud)

是否可以立即重置它们,以便其他线程看不到这种不一致?或者是否有必要将 x 和 y 捆绑成一个原子,而不是让 x 和 y 本身成为原子?

concurrency clojure thread-safety

1
推荐指数
1
解决办法
291
查看次数