让我们说我有一个相当复杂的碎片着色器,用于确定每个像素有多少光:
//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传递到着色器语言(这将很慢).理想情况下,我绘制的每个四边形我都想更新着色器参数.
这是我对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缓冲和裁剪!那么规则是什么?
如何获取宏模式下.hx文件使用的导入列表?更具体地讲,假设我有一个“ haxe.macro.Position”,它告诉我表达式属于哪个文件。我需要知道该文件用于将诸如“ Car”之类的删节类型声明转换为诸如“ vehicles.fourWheels.Car”之类的完整程序包路径类型的导入。
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是否实现给定接口的操作,而不是对象是否属于给定类?
让我们说你有:
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)呢?
假设 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 本身成为原子?