- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在使用 Open GL ES 2 fragment 着色器时遇到问题,想知道是否有人可以帮助我。
我正在使用着色器在屏幕上绘制变形球。比较简单,代码如下:
private static final String mFragmentShader = "precision mediump float;\n"
+ "uniform vec2 balls["
+ NUMBER_OF_BALLS
+ "];\n"
+ "float sqr(highp float x) { return x*x; }\n"
+ "void main() {\n"
+ " vec4 pixelColor = vec4(0.0, 0.0, 0.0, 0.0);\n"
+ " vec4 color = vec4(0.0, 0.5, 1.0, 1.0);\n"
+ " for (int i=0; i<"
+ NUMBER_OF_BALLS
+ "; ++i) {\n"
+ " vec2 dist = balls[i] - gl_FragCoord.xy;\n"
+ " float val = 100.0 / (sqr(dist.x) + sqr(dist.y));\n"
+ " pixelColor += color * val;\n"
+ " }\n"
+ " highp float a = smoothstep(0.9, 1.0, pixelColor.a);\n"
+ " gl_FragColor = vec4(pixelColor.rgb * a, 1.0);\n"
+ "}\n";
当 NUMBER_OF_BALLS 小于 15 时,着色器编译良好并且运行良好。不幸的是,当球的数量大于 15 时,它呈现为好像所有球的位置都在位置 (0,0)(参见 here ).我已经检查了着色器的输入,肯定是正确的,所以一定是着色器本身有问题。此外,如果我将精度从 mediump 更改为 high,那么我可以在渲染成为问题之前将球的数量增加到 20。
谁能告诉我我做错了什么?
编辑:这是完整的代码,以防 fragment 着色器本身没有问题。
private static final String mFragmentShader = "precision mediump float;\n"
+ "uniform vec2 balls["
+ NUMBER_OF_BALLS
+ "];\n"
+ "float sqr(highp float x) { return x*x; }\n"
+ "void main() {\n"
+ " vec4 pixelColor = vec4(0.0, 0.0, 0.0, 0.0);\n"
+ " vec4 color = vec4(0.0, 0.5, 1.0, 1.0);\n"
+ " for (int i=0; i<"
+ NUMBER_OF_BALLS
+ "; ++i) {\n"
+ " vec2 dist = balls[i] - gl_FragCoord.xy;\n"
+ " float val = 100.0 / (sqr(dist.x) + sqr(dist.y));\n"
+ " pixelColor += color * val;\n"
+ " }\n"
+ " highp float a = smoothstep(0.9, 1.0, pixelColor.a);\n"
+ " gl_FragColor = vec4(pixelColor.rgb * a, 1.0);\n"
+ "}\n";
private static final String mVertexShader = "attribute vec4 vPosition;\n" + "void main() {\n"
+ " gl_Position = vPosition;\n"
+ "}\n";
int gProgram;
int gvPositionHandle;
private float[][] balls = new float[NUMBER_OF_BALLS][2];
int[] lBalls = new int[NUMBER_OF_BALLS];
private static final int FLOAT_SIZE_BYTES = 4;
private final float[] mQuadVerticesData = { 1.0f, 1.0f, -1.0f, 1.0f, -1.0f, -1.0f, 1.0f, -1.0f, };
private FloatBuffer mQuadVertices;
public MetaballRenderer() {
mQuadVertices = ByteBuffer.allocateDirect(mQuadVerticesData.length * FLOAT_SIZE_BYTES)
.order(ByteOrder.nativeOrder())
.asFloatBuffer();
mQuadVertices.put(mQuadVerticesData).position(0);
}
private int loadShader(int shaderType, String source) {
int shader = GLES20.glCreateShader(shaderType);
if (shader != 0) {
GLES20.glShaderSource(shader, source);
GLES20.glCompileShader(shader);
int[] compiled = new int[1];
GLES20.glGetShaderiv(shader, GLES20.GL_COMPILE_STATUS, compiled, 0);
if (compiled[0] == 0) {
Log.e(TAG, "Could not compile shader " + shaderType + ":");
Log.e(TAG, GLES20.glGetShaderInfoLog(shader));
GLES20.glDeleteShader(shader);
shader = 0;
}
}
return shader;
}
private int createProgram(String vertexSource, String fragmentSource) {
int vertexShader = loadShader(GLES20.GL_VERTEX_SHADER, vertexSource);
if (vertexShader == 0) {
return 0;
}
int pixelShader = loadShader(GLES20.GL_FRAGMENT_SHADER, fragmentSource);
if (pixelShader == 0) {
return 0;
}
int program = GLES20.glCreateProgram();
if (program != 0) {
GLES20.glAttachShader(program, vertexShader);
checkGlError("glAttachShader");
GLES20.glAttachShader(program, pixelShader);
checkGlError("glAttachShader");
GLES20.glLinkProgram(program);
int[] linkStatus = new int[1];
GLES20.glGetProgramiv(program, GLES20.GL_LINK_STATUS, linkStatus, 0);
if (linkStatus[0] != GLES20.GL_TRUE) {
Log.e(TAG, "Could not link program: ");
Log.e(TAG, GLES20.glGetProgramInfoLog(program));
GLES20.glDeleteProgram(program);
program = 0;
}
}
return program;
}
private void init_balls() {
for (int i = 0; i < NUMBER_OF_BALLS; ++i) {
balls[i][0] = 200 + rand.nextInt(50);
balls[i][1] = 200 + rand.nextInt(50);
}
}
private void checkGlError(String op) {
int error;
while ((error = GLES20.glGetError()) != GLES20.GL_NO_ERROR) {
Log.e(TAG, op + ": glError " + error);
throw new RuntimeException(op + ": glError " + error);
}
}
@Override
public void onDrawFrame(GL10 arg0) {
GLES20.glUseProgram(gProgram);
checkGlError("glUseProgram");
for (int i = 0; i < NUMBER_OF_BALLS; ++i) {
GLES20.glUniform2fv(i, 1, balls[i], 0);
checkGlError("glUniform2fv");
}
GLES20.glVertexAttribPointer(gvPositionHandle, 2, GLES20.GL_FLOAT, false, 0, mQuadVertices);
checkGlError("glVertexAttribPointer");
GLES20.glEnableVertexAttribArray(gvPositionHandle);
checkGlError("glEnableVertexAttribArray");
GLES20.glDrawArrays(GLES20.GL_TRIANGLE_FAN, 0, 4);
checkGlError("glDrawArrays");
GLES20.glUseProgram(0);
checkGlError("glUseProgram");
}
@Override
public void onSurfaceChanged(GL10 glUnused, int width, int height) {
// Ignore the passed-in GL10 interface, and use the GLES20
// class's static methods instead.
gProgram = createProgram(mVertexShader, mFragmentShader);
if (gProgram == 0) {
return;
}
gvPositionHandle = GLES20.glGetAttribLocation(gProgram, "vPosition");
checkGlError("glGetAttribLocation");
init_balls();
for (int i = 0; i < NUMBER_OF_BALLS; ++i) {
lBalls[i] = GLES20.glGetUniformLocation(gProgram, "balls[" + i + "]");
checkGlError("glGetUniformLocation");
}
GLES20.glViewport(0, 0, width, height);
checkGlError("glViewport");
}
@Override
public void onSurfaceCreated(GL10 arg0, EGLConfig arg1) {
}
最佳答案
这段代码:
for (int i = 0; i < NUMBER_OF_BALLS; ++i) {
GLES20.glUniform2fv(i, 1, balls[i], 0);
checkGlError("glUniform2fv");
}
是不对的。您将 [0, NUMBER_OF_BALLS-1] 中的 i 作为统一位置传递,但必须使用 glGetUniformLocation 从 OpenGL 获取统一位置。
关于Android OPEN GL ES 2 fragment 着色器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4633896/
我必须在文本区域上绘制哪些选项? 我认识一些所见即所得的编辑器。我不确定他们使用的方法是什么,并且会看看他们以了解,但我知道像 tinymce 这样的事情已经存在了一段时间,所以我猜现在可能有更现代的
我在我的 woo commerce 商店页面中创建了一个子类别排序菜单。我想将链接到我现在所在页面的链接设置为红色。我对 css 没有问题,只是用 js 脚本。我怎样才能让它突出当前?这是我创建的排序
所以我使用 TextWrangler4.5.3 并主要使用 Python 编写脚本。当我编写 Python 时,我经常喜欢发表类似这样的评论:# BEGINS foo 然后是 # ENDS foo 我
我需要你的帮助! 我有一个表格,里面有行(姓名等)现在,当位于该行上的对象具有特定值时,我想为特定的 tableCells 背景着色。但我只得到它来读取这个单元格的值。但我需要阅读对象(在我的代码中称
有人知道在 uikit 中给 uiactionsheet 着色吗? 最佳答案 是的,因为它是一个 UIView(如 kmit 所述),您可以使用以下命令:addSubview,因此您可以添加自己的背景
在 vba 中,我想从工作表中的单元格中读取颜色来为条形图中的特定条形着色。我的问题是我的颜色格式为 4F9F92,但要在 makro 中读取它,我需要使用单元格中的 excel 颜色代码 40762
我正在尝试绘制一个 geom_histogram,其中条形图由渐变着色。 这就是我想要做的: library(ggplot2) set.seed(1) df <- data.frame(id=past
我正在构建一个带有 shiny 的应用程序,并使用与 Shiny gallery ( http://shiny.rstudio.com/gallery/slider-bar-and-slider-ra
在 iOS 6 和 xcode 4 中,我有这个: https://dl.dropboxusercontent.com/u/60718318/photo.PNG使用代码可以轻松创建 [editButt
我正在向我的 iPhone UI 添加自定义按钮,并希望使它们具有 Apple 应用程序中的玻璃外观。我有一个很好的默认玻璃图像,但我不想为我想要的每种色调(红色、绿色、蓝色等)都有一个单独的图像。
我到处寻找但没有找到解决方案。我有图像 1。如何以编程方式使用渐变对它们进行着色以获得图像 2 和 3?以下是这些图像: 我通过 Photoshop 应用到它们的色调是简单的 2 色线性渐变。 我的问
有没有办法告诉 OS X 自动设置 NSToolbarItem 的样式/色调? 我通过 IB/Xcode 添加了一个“图像工具栏项”,并将图标设置为黑色 PDF as described in the
我试图区分列范围图表上的多种类型的数据。问题是我希望能够按多个标准对它们进行分组。 我可以轻松地为不同的列着色,从而解决一个问题,但我希望能够根据我传递到图表的数据,为 xAxis 上的类别(图表是倒
有人在编译模式 Emacs 中添加了对 ansi-color 的支持吗?如果是这样,颜色写入程序必须检查什么属性/属性才能确保其事件终端支持 ANSI 转义着色。 最佳答案 已经有一个函数可以将颜色应
我正在尝试实现 Phong 着色模型,但我不确定如何选择光源。更具体地说,我不明白光源应该是什么样子。它应该是vec3吗?或者也许是我在 Java 代码中定义的矩阵?另外,如果我们假设我希望相机作为光
我有 2 个 dhtmlxSidebars,就像示例中一样 here如何为嵌套背景设置不同的背景颜色?如果我添加CSS .dhxsidebar_side { background-color:
我有一个 JTable,每行都根据最后一列中的值着色。 但是,当我单击标题对行进行排序时,颜色不会跟随行。 我尝试在 JTable 鼠标退出事件上调用我的“colourTable”方法(我知道 Hac
geom_hline 似乎忽略了美观,我错过了什么还是这是一个错误? df session 信息: R version 3.4.4 (2018-03-15) Platform: x86_64-pc-
这个问题已经有答案了: How to draw a BufferedImage with a color tint (1 个回答) 已关闭 8 年前。 如何将通过此处的图标着色为不同的颜色?假设我想拍
我想为除我点击的那个之外的所有 div 着色。在我的代码中它有效,但只有一次。如果我点击另一个 div,它不起作用。 http://jsfiddle.net/6VhK8/353/ id="1
我是一名优秀的程序员,十分优秀!