- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这是我第一次使用 Android 和 OpenGL ES,但我确实有相当多的直接 OpenGL 经验。我只是想画一个红色三角形。没有制服,只有一个顶点属性。
顶点着色器:
#version 300 es
in vec3 in_loc;
void main() {
gl_Position.xyz = in_loc;
}
fragment 着色器:
#version 300 es
precision mediump float;
out vec4 outColor;
void main() {
outColor = vec4(1.0f, 0.0f, 0.0f, 1.0f);
}
结果:
我在着色器创建、编译、附加和链接期间检查并没有发现任何错误。我试过将 precision mediump float;
更改为 precision highp float;
和 precision lowp float;
。
通常我希望这个纯黑色输出表示 fragment 着色器损坏,但我没有收到任何错误,而且据我所知这是非常简单的代码,与网上找到的各种示例代码相同。
着色器创建代码:
public class Shader {
public enum Type { VERTEX, FRAGMENT }
static private int createShader(String src, Type type) {
int shaderHandle = 0;
switch (type) {
case VERTEX:
shaderHandle = GLES30.glCreateShader(GLES30.GL_VERTEX_SHADER);
break;
case FRAGMENT:
shaderHandle = GLES30.glCreateShader(GLES30.GL_FRAGMENT_SHADER);
break;
}
if (shaderHandle == 0) {
Log.e("Shader", "Failed to create shader");
return 0;
}
// Compile shader
GLES30.glShaderSource(shaderHandle, src);
GLES30.glCompileShader(shaderHandle);
// Check for compile errors
int status[] = { 0 };
GLES30.glGetShaderiv(shaderHandle, GLES30.GL_COMPILE_STATUS, status, 0);
if (status[0] == 0) {
Log.e("Shader", "Failed to compile shader");
Log.e("Shader", GLES30.glGetShaderInfoLog(shaderHandle));
GLES30.glDeleteShader(shaderHandle);
return 0;
}
// Check for OpenGL errors
if (Util.isGLError()) {
GLES30.glDeleteShader(shaderHandle);
return 0;
}
return shaderHandle;
}
static private int createProgram(int vertShaderHandle, int fragShaderHandle) {
int programHandle = GLES30.glCreateProgram();
if (programHandle == 0) {
Log.e("Shader", "Failed to create program");
return 0;
}
// Attach and link shaders to form program
GLES30.glAttachShader(programHandle, vertShaderHandle);
GLES30.glAttachShader(programHandle, fragShaderHandle);
GLES30.glLinkProgram(programHandle);
// Check for linking errors
int status[] = { 0 };
GLES30.glGetProgramiv(programHandle, GLES30.GL_LINK_STATUS, status, 0);
if (status[0] == 0) {
Log.e("Shader", "Failed to link program");
Log.e("Shader", GLES30.glGetProgramInfoLog(programHandle));
GLES30.glDeleteProgram(programHandle);
return 0;
}
// Check for OpenGL errors
if (Util.isGLError()) {
GLES30.glDeleteProgram(programHandle);
return 0;
}
return programHandle;
}
private String name;
private int programHandle;
public Shader(String name) {
this.name = name;
this.programHandle = 0;
}
public boolean initFromSrc(String vertSrc, String fragSrc) {
// Create shaders
int vertShaderHandle = createShader(vertSrc, Type.VERTEX);
if (vertShaderHandle == 0) {
Log.e("Shader", "Failed to create vertex shader");
return false;
}
int fragShaderHandle = createShader(fragSrc, Type.FRAGMENT);
if (fragShaderHandle == 0) {
Log.e("Shader", "Failed to create fragment shader");
GLES30.glDeleteShader(vertShaderHandle);
return false;
}
// Create shader program
programHandle = createProgram(vertShaderHandle, fragShaderHandle);
if (programHandle == 0) {
Log.e("Shader", "Failed to create program");
GLES30.glDeleteShader(vertShaderHandle);
GLES30.glDeleteShader(fragShaderHandle);
return false;
}
// Shaders can now be deleted
GLES30.glDeleteShader(vertShaderHandle);
GLES30.glDeleteShader(fragShaderHandle);
return true;
}
public boolean initFromFile(String vertFile, String fragFile) {
String vertSrc = Util.readTextFile(vertFile);
if (vertSrc == null) {
Log.e("Shader", "Failed to read shader file: " + vertFile);
return false;
}
String fragSrc = Util.readTextFile(fragFile);
if (fragSrc == null) {
Log.e("Shader", "Failed to read shader file: " + fragFile);
return false;
}
return initFromSrc(vertSrc, fragSrc);
}
public int getProgramHandle() { return programHandle; }
}
其他一切:
@Override
public void onSurfaceCreated(GL10 unused, EGLConfig config) {
GLES30.glClearColor(0.0f, 0.5f, 1.0f, 1.0f);
shader = new Shader("basic");
if (!shader.initFromFile("shaders/basic.vert", "shaders/basic.frag")) {
Log.e("MainRenderer", "Failed to initialize basic shader");
}
float[] locs = {
0.0f, 0.0f, 0.0f,
1.0f, 0.0f, 0.0f,
1.0f, 1.0f, 0.0f
};
ByteBuffer locsBB = ByteBuffer.allocateDirect(locs.length * 4);
locsBB.order(ByteOrder.nativeOrder());
FloatBuffer locsFB = locsBB.asFloatBuffer();
locsFB.put(locs);
int[] vboArr = { 0 };
GLES30.glGenBuffers(1, vboArr, 0);
int vboHandle = vboArr[0];
GLES30.glBindBuffer(GLES30.GL_ARRAY_BUFFER, vboHandle);
GLES30.glBufferData(GLES30.GL_ARRAY_BUFFER, locs.length * 4, locsBB, GLES30.GL_STATIC_DRAW);
GLES30.glBindBuffer(GLES30.GL_ARRAY_BUFFER, 0);
int[] indices = {
0, 1, 2
};
ByteBuffer indicesBB = ByteBuffer.allocateDirect(indices.length * 4);
indicesBB.order(ByteOrder.nativeOrder());
IntBuffer indicesIB = indicesBB.asIntBuffer();
indicesIB.put(indices);
int[] iboArr = { 0 };
GLES30.glGenBuffers(1, iboArr, 0);
int iboHandle = iboArr[0];
GLES30.glBindBuffer(GLES30.GL_ELEMENT_ARRAY_BUFFER, iboHandle);
GLES30.glBufferData(GLES30.GL_ELEMENT_ARRAY_BUFFER, indices.length * 4, indicesBB, GLES30.GL_STATIC_DRAW);
GLES30.glBindBuffer(GLES30.GL_ELEMENT_ARRAY_BUFFER, 0);
int[] vaoArr = { 0 };
GLES30.glGenVertexArrays(1, vaoArr, 0);
vaoHandle = vaoArr[0];
if (vaoHandle == 0) {
Log.e("MainRenderer", "Failed to create vao");
}
GLES30.glBindVertexArray(vaoHandle);
int locationAI = GLES30.glGetAttribLocation(shader.getProgramHandle(), "in_loc");
GLES30.glEnableVertexAttribArray(locationAI);
GLES30.glBindBuffer(GLES30.GL_ARRAY_BUFFER, vboHandle);
GLES30.glVertexAttribPointer(locationAI, 3, GLES30.GL_FLOAT, false, 0, 0);
GLES30.glBindBuffer(GLES30.GL_ELEMENT_ARRAY_BUFFER, iboHandle);
GLES30.glBindVertexArray(0);
GLES30.glBindBuffer(GLES30.GL_ARRAY_BUFFER, 0);
GLES30.glBindBuffer(GLES30.GL_ELEMENT_ARRAY_BUFFER, 0);
}
@Override
public void onDrawFrame(GL10 unused) {
// Redraw background color
GLES30.glClear(GLES30.GL_COLOR_BUFFER_BIT);
// Draw triangle
GLES30.glBindVertexArray(vaoHandle);
GLES30.glDrawElements(GLES30.GL_TRIANGLES, 3, GLES30.GL_UNSIGNED_INT, 0);
GLES30.glBindVertexArray(0);
}
最佳答案
正如 Ville 指出的那样,问题是我没有在 draw 方法中使用该程序。
修订:
// Draw triangle
// Actually use the program
GLES30.glUseProgram(shader.getProgramHandle());
GLES30.glBindVertexArray(vaoHandle);
GLES30.glDrawElements(GLES30.GL_TRIANGLES, 3, GLES30.GL_UNSIGNED_INT, 0);
GLES30.glBindVertexArray(0);
GLES30.glUseProgram(0);
关于java - OpenGL ES 3.0 Hello 三角形是黑色的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49715750/
我刚刚创建了一个带有几个表 Controller 和一个 View Controller 的 Storyboard。 一切正常,直到我的应用程序推送 View Controller :它显示为全黑。
我尝试通过添加一个名为“铀”的新元素来修改我的世界。因此,我在主包中创建了“Trauma.java”类以及下面列出的其他一些类。所有包和类: Package Explorer Trauma.java
我一直在学习如何使用 UICollection View 。我制作了一个新的 UICollectionView Controller ,并将 collectionview 单元格标识为 main.st
我想加一个超细的黑边 在这个环的边界上方和下方。 http://jsfiddle.net/PUBqA/5/ 目标是让这个戒指容易看 在白色背景上。 唯一的方法就是添加一些薄的 环外环内黑色边框。 这是
假设我有以下 python 文件 exclude_from_black.py在我的项目的根目录中: print('I want single quotes') 我试图从黑色重新格式化中排除此文件,但以
我的 Canvas 有问题。比方说,1/10 的时候我在 chrome 上有黑色方 block 而不是我的图像。我的代码如下,我该如何修改它以避免这种黑色显示? var canvas = docu
我正在尝试使用图案作为 SKScene 的背景颜色: override func didMoveToView(view: SKView) { let backgroundImage:
我正在尝试浏览一些 Collection View Swift 教程,但它们总是显示为空白/黑色页面,就好像我没有设置初始 View Controller 一样。不过,我只使用了 1 个 UIColl
我有一个标签栏应用程序。 标签栏中只有 2 个选项卡。第一个选项卡是 NavigationController,第二个选项卡是 TableViewController。第二个工作完美,但第一个则不然。
我正在通过串行端口(ttyO2)连接 BBB 和一组 arduino。我有一个数组要从 BBB 发送到一组 arduino。我需要让 BBB 发送请求并等待其中一个 arduino 的回复,但如果在一
附上图片。我能够摆脱边界上的背景区域,但图像中的背景区域仍然存在。有没有什么方法可以消除图像中的小背景区域。谢谢。 最佳答案 这个问题有一个简单的解决方法,基本思想是在 RGB 颜色空间中分割图像以过
我以前从未做过图像处理。 我现在需要检查来自相机的许多 jpeg 图像,以丢弃那些非常暗(几乎是黑色)的图像。 是否有我可以使用的免费库 (.NET)?谢谢。 最佳答案 Aforge是一个很棒的图像处
这个问题在这里已经有了答案: Background ListView becomes black when scrolling (12 个答案) 关闭 9 年前。 这是我第一次访问这个网站。我会请你
我在 iOS 上更改启动屏幕的背景颜色时遇到问题。当我第一次打开应用程序时,它会在黑色 viewcontroller 出现之前加载一个白页。如何将白色启动屏幕更改为黑色? 下面是我的应用程序的一般启动
我想检测字体的样式(粗体、粗体、黑色)。但我只能检测字体是否为粗体。 BOOL isBold = (font.fontDescriptor.symbolicTraits & UIFontDescrip
我正在尝试解决一个软件错误,在该错误中,我们认为某个应用可能不会在每次调用时都启动。为了对此进行测试,我创建了一系列计划任务来启动应用程序、截取屏幕截图,然后关闭应用程序。这些任务都是通过 .bat
完全被难住了。我已经遍地查看并实现了我能找到的每一个解决方案。我似乎无法让导航栏变得透明。 当尝试设置背景颜色时,我只在顶部看到一个黑条。就像我尝试设置背景图像一样。我已经尝试了所有这些以及所有这些变
我创建了一个 TextView ,如果文本太长,它将使其可滚动。但是,如果您单击它或将手指放在上面,它会像被单击一样变成黑色。有谁知道使它不能点击但仍然能够滚动的代码?谢谢! 在我的 xml 中定义其
我正在尝试将 DS1307 RTC 集成到 beaglebone black 上,其中我正在使用 rootfs 构建自定义内核,我使用了 beagle P9.17 和 P9.18 的 SCL 和 SD
线性渐变适用于图像,但文本不会出现在图像前景上。此外,渐变不应该出现在文本上。我哪里做错了? 任何帮助都感激不尽。 .glimage { display: flex; justify-cont
我是一名优秀的程序员,十分优秀!