关于 OpenGL shader language 的问题

如一下GLSL代码

  • layout (location = 0) in vec3 position;
  • void main() {
  • gl_Position = vec4(position.x, position.y, position.z, 1.0);
  • } layout (location = 0) in vec3 position; 这句是什么意思? gl_Position = vec4(position.x, position.y, position.z, 1.0); 这句中的 最后一个数 1.0 代表着什么

第一次来CSDN, 望诸位帮帮忙

1个回答

装 CPAN安装,都安装了,再次安装提示安装是最新,但是check的时候就是提示not found。看google说这个因为安装文件位置不一致,求解呀 折腾了1天了

Chart: /usr/bin/perl install-module.pl Chart::Lines
Template-GD: /usr/bin/perl install-module.pl Template::Plugin::GD::Image
[root@localhost Bugzilla]# perl install-module.pl --all
Checking for CPAN (v1.81) ok: found v1.9800
Checking for YAML (any) ok: found v1.15
Checking for ExtUtils-MakeMaker (v6.31) ok: found v6.68
Reading '/root/.cpan/Metadata'
Database was generated on Fri, 17 Jun 2016 20:17:02 GMT
Installing Chart::Lines version 2.004010...
Chart::Lines is up to date (2.4.10).
Installing Template::Plugin::GD::Image version 1.56...
Template::Plugin::GD::Image is up to date (1.56).
Installing GD::Text version 0.86...
GD::Text is up to date (0.86).

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
opengl shader编写规则

opengl shader怎么编写 有什么规则 或需要注意的地方 尤其是顶点着色器和细分着色器的相关内容。 新手希望有详细的 望指教。 (是不是所有要的变化都在.vs或.ps内编写?)

关于OpenGL用shader来使用贴图的一些问题

我想实现用shader来显示贴图,但是总是没办法显示图片,只能显示一个灰色的三角形,希望有人能帮我看看是什么问题,下面是代码 void initTest(char* fileName1, char* fileName2) { Shader shader("D:\\VS2013Project\\CPP_Project\\subdivision\\subdivision\\Shader\\shaderTextureTest"); shader.Bind(); currentShader = shader.GetProgram(); tex_model_view_matrix_loc = glGetUniformLocation(shader.GetProgram(), "model_view_matrix"); tex_projection_matrix_loc = glGetUniformLocation(shader.GetProgram(), "projection_matrix"); tex_sampler_texture_unit = glGetUniformLocation(shader.GetProgram(), "tex"); int imageWidth1, imageHeight1; FREE_IMAGE_FORMAT fif1 = FreeImage_GetFileType(fileName1); FIBITMAP* dib1 = FreeImage_Load(fif1, fileName1, 0); if (dib1 == NULL) return; dib1 = FreeImage_ConvertTo24Bits(dib1); BYTE* image1Data; imageWidth1 = FreeImage_GetWidth(dib1); imageHeight1 = FreeImage_GetHeight(dib1); image1Data = FreeImage_GetBits(dib1); static const GLfloat vertex_array[] = { 0.0f, 0.0f, 0.0f, 1.0f, 10.0f, 0.0f, 0.0f, 1.0f, 0.0f, 10.0f, 0.0f, 1.0f, 10.0f, 10.0f, 0.0f, 1.0f }; static const GLfloat tex_coord_array[] = { 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f }; //glActiveTexture(GL_TEXTURE1); //以下是处理顶点数据和纹理坐标数据的代码 glGenBuffers(1, textureVertexDataBuffer); glBindBuffer(GL_ARRAY_BUFFER, textureVertexDataBuffer[0]); glBufferData(GL_ARRAY_BUFFER, sizeof(vertex_array) + sizeof(tex_coord_array), NULL, GL_STATIC_DRAW); glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(vertex_array), vertex_array); glBufferSubData(GL_ARRAY_BUFFER, sizeof(vertex_array), sizeof(tex_coord_array), tex_coord_array); glGenVertexArrays(1, textureVAO); glBindVertexArray(textureVAO[0]); glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, (void*)(0)); glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 0, (void*)(vertex_array)); glEnableVertexAttribArray(0); glEnableVertexAttribArray(1); glGenTextures(1, textureBuffer); glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, textureBuffer[0]); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, imageWidth1, imageHeight1, 0, GL_RGB, GL_UNSIGNED_BYTE, image1Data); glUniform1i(tex_sampler_texture_unit, 0); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); } void display() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glUseProgram(currentShader); vmath::mat4 projection_matrix(vmath::perspective(45, aspect, 0.1, 100)); vmath::vecN<float, 3> eye; eye[0] = 0.0f; eye[1] = 0.0f; eye[2] = 6.0f; vmath::vecN<float, 3> center; center[0] = 0.0f; center[1] = 0.0f; center[2] = 0.0f; vmath::vecN<float, 3> up; up[0] = 0.0f; up[1] = 1.0f; up[2] = 0.0f; vmath::mat4 modelView_matrix(vmath::lookat(eye, center, up)); glUniformMatrix4fv(tex_model_view_matrix_loc, 1, GL_FALSE, modelView_matrix); glUniformMatrix4fv(tex_projection_matrix_loc, 1, GL_FALSE, projection_matrix); glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, textureBuffer[0]); glBindVertexArray(textureVAO[0]); glDrawArrays(GL_TRIANGLES, 0, 3); glutSwapBuffers(); } 下面是shader的代码: vert: #version 430 core layout (location = 0) in vec4 vertex_position; layout (location = 1) in vec2 texture_coord; uniform mat4 model_view_matrix; uniform mat4 projection_matrix; out vec2 output_tex_coord; void main() { gl_Position = projection_matrix * model_view_matrix * vertex_position; output_tex_coord = texture_coord; } frag: #version 430 core uniform sampler2D tex; layout (location = 0) out vec4 color; in vec2 output_tex_coord; void main() { color = texture(tex, output_tex_coord); } 下面是结果 ![图片说明](https://img-ask.csdn.net/upload/201706/04/1496571190_821232.png)

opengl shader 自定义函数出错问题

void thirdCut(vec3 p0, vec3 p1, vec3 p2, vec3 normal); void secondCut(vec3 p0, vec3 p1, vec3 p2, vec3 normal); void main() void secondCut(vec3 p0, vec3 p1, vec3 p2, vec3 normal) { vec3 p0, vec3 p1, vec3 p2, vec3 normal; thirdCut(p0, p1, p2, normal); } void thirdCut(vec3 p0, vec3 p1, vec3 p2, vec3 normal) { vec4 view01; view01.r = 0; } 上面为集合着色器大概思路 在写thirdCut()函数时, vec4 view01; view01.r = 0; 然后对view01 进行输出就会运行出错

OpenGL Shader 递归处理像素

一个图片处理的OpenGL程序,处理当前像素需要使用前一个像素值,但是不是原图中的像素值,而是经过处理后的前一个像素值,请问这样的递归在fragment shader里面能做吗?

OpenGL中的ModelMatrix如何在Shader中使用

以下是普通的C# OpneGL代码: GL.Viewport(0, 0, glWin.Width, glWin.Height); GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit); GL.MatrixMode(MatrixMode.Modelview); GL.LoadIdentity(); GL.Scale(0.5, 0.5, 0.5); GL.Rotate(60, 1, 0, 0); GL.Translate(1, 0, 0); float[] mat = new float[16]; GL.GetFloat(GetPName.ModelviewMatrix, mat); GL.GetFloat(GetPName.ProjectionMatrix, mat); GL.Begin(PrimitiveType.Triangles); GL.Color3(Color.MidnightBlue); GL.Vertex2(-1.0f, 1.0f); GL.Color3(Color.SpringGreen); GL.Vertex2(0.0f, -1.0f); GL.Color3(Color.Ivory); GL.Vertex2(1.0f, 1.0f); GL.End(); 移植到WebGL时,由于只能使用Shader的关系,所以先通过 GetFloat 取得了C#运行时的ModelMatrix值。然后在 js 中直接把该值传入到下面的VertexShader的MVMatrix里面,但是 画出的效果却不相同。 attribute vec3 ModelVertex; uniform mat4 MVMatrix; void main(void){ gl_Position = vec4(ModelVertex, 1.0) * MVMatrix; } Shader是不是写错了?

OpenGL用 shader 如何实现对立方体的单个面添加纹理

注意, 是用shader 给单个面添加。OpenGL老的接口实现我会。

opengl如何使用shader

opengl新手入门,用的是visual2013,使用glut来写的opengl。目前学会了基础画图,想要用shader处理,可是不知道如何入手,请问该怎么学? 问题1:我目前只在头文件中包含glut.h,偶尔用到math.h与stdio.h,如果我想使用shader的话需要哪些头文件? 问题2:目前知道shader需要创建.frag和.vert,需要在main.cpp中如何操作才能链接到这两个文件? 问题3:.frag和.vert文件中需要都是用什么代码来进行处理的?

opengl怎么进行参数传递?

opengl代码中怎么进行参数传递?在main函数中用scanf输入数据后,怎么传递给函数?

cocos2d-x opengl es shader 进行渐变色的滚动效果

学习cocos还有es的新人小白一枚,想做一段会向上滚动的渐变光,而且在经过特殊点的时候可以控制不让渐变光绘画,但是该处理的效果还要处理,只不过是有一部分不会被绘制在屏幕上,请问这个使用shader能够实现的吗,我试着编写了一下,发现渐变光不能按照自己的意思绘制,求求大神。另外如果有会渐变光混色的能教我下也行,想了两周了,还是不知道怎么画,各位大神多帮忙!

关于OpenGL球体贴图问题

现在画了一个球体,但是不知道怎样把一张世界地图的图片贴到他的表面上,希望有大神能帮帮我,谢谢你们了~!

怎么解决opengl使用C++文件流读取着色器内容时发生错误的问题?

![图片说明](https://img-ask.csdn.net/upload/201904/18/1555600254_301885.png) ``` //main.cpp #include <glad/glad.h> #include <GLFW/glfw3.h> #include "filesystem.h" #include "shader.h" #define STB_IMAGE_IMPLEMENTATION #include <stb_image.h> #include <iostream> void framebuffer_size_callback(GLFWwindow* window, int width, int height); void processInput(GLFWwindow *window); // settings const unsigned int SCR_WIDTH = 600; const unsigned int SCR_HEIGHT = 600; float mixValue = 0.2f; int main() { // glfw: initialize and configure // ------------------------------ glfwInit(); glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); #ifdef __APPLE__ glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); // uncomment this statement to fix compilation on OS X #endif // glfw window creation // -------------------- GLFWwindow* window = glfwCreateWindow(SCR_WIDTH, SCR_HEIGHT, "LearnOpenGL", NULL, NULL); if (window == NULL) { std::cout << "Failed to create GLFW window" << std::endl; glfwTerminate(); return -1; } glfwMakeContextCurrent(window); glfwSetFramebufferSizeCallback(window, framebuffer_size_callback); // glad: load all OpenGL function pointers // --------------------------------------- if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)) { std::cout << "Failed to initialize GLAD" << std::endl; return -1; } // build and compile our shader zprogram // ------------------------------------ Shader ourShader("4.1.texture.vs", "4.1.texture.fs"); // set up vertex data (and buffer(s)) and configure vertex attributes // ------------------------------------------------------------------ float vertices[] = { // positions // colors // texture coords 0.5f, 0.5f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, // top right 0.5f, -0.5f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, // bottom right -0.5f, -0.5f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, // bottom left -0.5f, 0.5f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, // top left }; unsigned int indices[] = { 0, 1, 3, // first triangle 1, 2, 3 // second triangle }; unsigned int VBO, VAO, EBO; glGenVertexArrays(1, &VAO); glGenBuffers(1, &VBO); glGenBuffers(1, &EBO); glBindVertexArray(VAO); glBindBuffer(GL_ARRAY_BUFFER, VBO); glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO); glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW); // position attribute glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)0); glEnableVertexAttribArray(0); // color attribute glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)(3 * sizeof(float))); glEnableVertexAttribArray(1); // 解析纹理坐标数据,请补充完整 //texture coord attribute glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)(6 * sizeof(float))); glEnableVertexAttribArray(2); stbi_set_flip_vertically_on_load(true); //创建纹理过程,请补充完整 // load and create a texture // ------------------------- unsigned int texture1,texture2; glGenTextures(1, &texture1); glBindTexture(GL_TEXTURE_2D, texture1); // set the texture wrapping parameters glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); // set texture wrapping to GL_REPEAT (default wrapping method) glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); // set texture filtering parameters glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); // The FileSystem::getPath(...) is part of the GitHub repository so we can find files on any IDE/platform; replace it with your own image path. int width, height, nrChannels; unsigned char *data = stbi_load("D:/LearnOpenGL-master/LearnOpenGL-master/resources/textures/container.jpg", &width, &height, &nrChannels, 0); if (data) { glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, data); glGenerateMipmap(GL_TEXTURE_2D); } else { std::cout << "Failed to load texture1" << std::endl; } glGenTextures(1, &texture2); glBindTexture(GL_TEXTURE_2D, texture2); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); data = stbi_load("D:/LearnOpenGL-master/LearnOpenGL-master/resources/textures/awesomeface.png", &width, &height, &nrChannels, 0); if (data) { glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, data); glGenerateMipmap(GL_TEXTURE_2D); } else { std::cout << "Failed to load texture2" << std::endl; } ourShader.use(); glUniform1i(glGetUniformLocation(ourShader.ID, "texture1"), 0); ourShader.setInt("texture2", 1); // render loop // ----------- while (!glfwWindowShouldClose(window)) { // input // ----- processInput(window); // render // ------ glClearColor(0.2f, 0.3f, 0.3f, 1.0f); glClear(GL_COLOR_BUFFER_BIT); // bind Texture glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, texture1); glActiveTexture(GL_TEXTURE1); glBindTexture(GL_TEXTURE_2D, texture2); // set the texture mix value in the shader ourShader.setFloat("mixValue", mixValue); // render container ourShader.use(); glBindVertexArray(VAO); glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0); // glfw: swap buffers and poll IO events (keys pressed/released, mouse moved etc.) // ------------------------------------------------------------------------------- glfwSwapBuffers(window); glfwPollEvents(); } // optional: de-allocate all resources once they've outlived their purpose: // ------------------------------------------------------------------------ glDeleteVertexArrays(1, &VAO); glDeleteBuffers(1, &VBO); glDeleteBuffers(1, &EBO); // glfw: terminate, clearing all previously allocated GLFW resources. // ------------------------------------------------------------------ glfwTerminate(); return 0; } // process all input: query GLFW whether relevant keys are pressed/released this frame and react accordingly // --------------------------------------------------------------------------------------------------------- void processInput(GLFWwindow *window) { if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS) glfwSetWindowShouldClose(window, true); if (glfwGetKey(window, GLFW_KEY_UP) == GLFW_PRESS) { mixValue += 0.001f; // change this value accordingly (might be too slow or too fast based on system hardware) if (mixValue >= 1.0f) mixValue = 1.0f; } if (glfwGetKey(window, GLFW_KEY_DOWN) == GLFW_PRESS) { mixValue -= 0.001f; // change this value accordingly (might be too slow or too fast based on system hardware) if (mixValue <= 0.0f) mixValue = 0.0f; } } // glfw: whenever the window size changed (by OS or user resize) this callback function executes // --------------------------------------------------------------------------------------------- void framebuffer_size_callback(GLFWwindow* window, int width, int height) { // make sure the viewport matches the new window dimensions; note that width and // height will be significantly larger than specified on retina displays. glViewport(0, 0, width, height); } //shader_s.h #ifndef SHADER_H #define SHADER_H #include <glad/glad.h> #include <string> #include <fstream> #include <sstream> #include <iostream> class Shader { public: unsigned int ID; // constructor generates the shader on the fly // ------------------------------------------------------------------------ Shader(const char* vertexPath, const char* fragmentPath) { // 1. retrieve the vertex/fragment source code from filePath std::string vertexCode; std::string fragmentCode; std::ifstream vShaderFile; std::ifstream fShaderFile; // ensure ifstream objects can throw exceptions: vShaderFile.exceptions (std::ifstream::failbit | std::ifstream::badbit); fShaderFile.exceptions (std::ifstream::failbit | std::ifstream::badbit); try { // open files vShaderFile.open(vertexPath); fShaderFile.open(fragmentPath); std::stringstream vShaderStream, fShaderStream; // read file's buffer contents into streams vShaderStream << vShaderFile.rdbuf(); fShaderStream << fShaderFile.rdbuf(); // close file handlers vShaderFile.close(); fShaderFile.close(); // convert stream into string vertexCode = vShaderStream.str(); fragmentCode = fShaderStream.str(); } catch (std::ifstream::failure e) { std::cout << "ERROR::SHADER::FILE_NOT_SUCCESFULLY_READ" << std::endl; } const char* vShaderCode = vertexCode.c_str(); const char * fShaderCode = fragmentCode.c_str(); // 2. compile shaders unsigned int vertex, fragment; // vertex shader vertex = glCreateShader(GL_VERTEX_SHADER); glShaderSource(vertex, 1, &vShaderCode, NULL); glCompileShader(vertex); checkCompileErrors(vertex, "VERTEX"); // fragment Shader fragment = glCreateShader(GL_FRAGMENT_SHADER); glShaderSource(fragment, 1, &fShaderCode, NULL); glCompileShader(fragment); checkCompileErrors(fragment, "FRAGMENT"); // shader Program ID = glCreateProgram(); glAttachShader(ID, vertex); glAttachShader(ID, fragment); glLinkProgram(ID); checkCompileErrors(ID, "PROGRAM"); // delete the shaders as they're linked into our program now and no longer necessary glDeleteShader(vertex); glDeleteShader(fragment); } // activate the shader // ------------------------------------------------------------------------ void use() { glUseProgram(ID); } // utility uniform functions // ------------------------------------------------------------------------ void setBool(const std::string &name, bool value) const { glUniform1i(glGetUniformLocation(ID, name.c_str()), (int)value); } // ------------------------------------------------------------------------ void setInt(const std::string &name, int value) const { glUniform1i(glGetUniformLocation(ID, name.c_str()), value); } // ------------------------------------------------------------------------ void setFloat(const std::string &name, float value) const { glUniform1f(glGetUniformLocation(ID, name.c_str()), value); } private: // utility function for checking shader compilation/linking errors. // ------------------------------------------------------------------------ void checkCompileErrors(unsigned int shader, std::string type) { int success; char infoLog[1024]; if (type != "PROGRAM") { glGetShaderiv(shader, GL_COMPILE_STATUS, &success); if (!success) { glGetShaderInfoLog(shader, 1024, NULL, infoLog); std::cout << "ERROR::SHADER_COMPILATION_ERROR of type: " << type << "\n" << infoLog << "\n -- --------------------------------------------------- -- " << std::endl; } } else { glGetProgramiv(shader, GL_LINK_STATUS, &success); if (!success) { glGetProgramInfoLog(shader, 1024, NULL, infoLog); std::cout << "ERROR::PROGRAM_LINKING_ERROR of type: " << type << "\n" << infoLog << "\n -- --------------------------------------------------- -- " << std::endl; } } } }; #endif

OpenGL-一次将所有数据传递到着色器时遇到麻烦

<div class="post-text" itemprop="text"> <p>I'm trying to display textures on quads (2 triangles) using opengl 3.3</p> <p>Drawing a texture on a quad works great; however when I have ONE textures (sprite atlas) but using 2 quads(objects) to display different parts of the atlas. When in draw loop, they end up switching back and fourth(one disappears than appears again, etc) at their individual translated locations.</p> <p>The way I'm drawing this is not the standard DrawElements for each quad(or object) but I package all quads, uv, translations, etc send them up to the shader as one big chunk (as "in" variables): Vertex shader:</p> <pre><code> #version 330 core // Input vertex data, different for all executions of this shader. in vec3 vertexPosition_modelspace; in vec3 vertexColor; in vec2 vertexUV; in vec3 translation; in vec4 rotation; in vec3 scale; // Output data ; will be interpolated for each fragment. out vec2 UV; // Output data ; will be interpolated for each fragment. out vec3 fragmentColor; // Values that stay constant for the whole mesh. uniform mat4 MVP; ... void main(){ mat4 Model = mat4(1.0); mat4 t = translationMatrix(translation); mat4 s = scaleMatrix(scale); mat4 r = rotationMatrix(vec3(rotation), rotation[3]); Model *= t * r * s; gl_Position = MVP * Model * vec4 (vertexPosition_modelspace,1); //* MVP; // The color of each vertex will be interpolated // to produce the color of each fragment fragmentColor = vertexColor; // UV of the vertex. No special space for this one. UV = vertexUV; } </code></pre> <p>Is the vertex shader working as I think it would with a large chunk of data - that it draws each segment passed up as uniform individually because it does not seem like it? Is my train of thought correct on this?</p> <p>For completeness this is my fragment shader:</p> <pre><code>#version 330 core // Interpolated values from the vertex shaders in vec3 fragmentColor; // Interpolated values from the vertex shaders in vec2 UV; // Ouput data out vec4 color; // Values that stay constant for the whole mesh. uniform sampler2D myTextureSampler; void main() { // Output color = color of the texture at the specified UV color = texture2D( myTextureSampler, UV ).rgba; } </code></pre> <p>A request for more information was made so I will put how i bind this data up to the vertex shader. The following code is just one I use for my translations. I have more for color, rotation, scale, uv, etc:</p> <pre><code>gl.BindBuffer(gl.ARRAY_BUFFER, tvbo) gl.BufferData(gl.ARRAY_BUFFER, len(data.Translations)*4, gl.Ptr(data.Translations), gl.DYNAMIC_DRAW) tAttrib := uint32(gl.GetAttribLocation(program, gl.Str("translation\x00"))) gl.EnableVertexAttribArray(tAttrib) gl.VertexAttribPointer(tAttrib, 3, gl.FLOAT, false, 0, nil) </code></pre> <p>...</p> <pre><code>gl.DrawElements(gl.TRIANGLES, int32(len(elements)), gl.UNSIGNED_INT, nil) </code></pre> </div>

关于OpenGL矩阵变换的问题

如题,小弟有一个初级问题想请教,OpenGL中矩阵堆栈的最大深度是什么概念呢?希望高手可以用通俗的语言表达。另外,我在用OpenGL绘制装配体的时候,画完之前的装配体后(这个装配体包含在了压栈和出栈之间),再画下一个装配体的时候,进行平移变换时,发现变换的方向是按照上一个装配体中最后绘制零件的局部坐标系的方向进行的,但是对场景进行旋转操作时,第二个绘制的装配体的位置就发生了变化,其变化方向是按照原点坐标系的方向进行的,每次都是这样,也就是说,场景刚生成时第二个装配体在一个位置上,对场景旋转,第二个装配体就跑到另一个位置,此后再怎么旋转场景,第二个装配体的位置也不会发生变化。请问这是怎么回事?求高手解答

关于opengl中贴图的问题

屏幕上有个矩形,选中进行贴图。图形是水平的,若矩形是水平的贴图很简单,但若矩形是斜的怎么办?尝试逐像素对应贴图但计算公式带来误差,会使某些像素点没有贴上,有什么好的方法吗

一个关于opengl的视角的问题

一个OpenGL中可以建立两个摄像机吗?有不同的用途,其一是跟随物体的相机,第二个是我可以随时控制相机位置的相机,求大神指教

关于opengl帧缓存对象FBO深度缓存的问题

各位老师好,在下opengl菜鸟一枚,最近学习opengl和glsl的过程中,使用FBO的深度缓存做延时渲染的时候遇到了一些问题。 我想实现个shadowmap,在光源视角下将深度缓存渲染进fbo,但是渲染第一次结束后,附加到fbo中的深度纹理里面的值却全部都为0。后来为了测试问题,我删除掉了第二个shader,只保留了第一个用来产生shadowmap的shader,发现fbo深度缓存依然都是0。如能指教迷津,不胜感激。一下是我的代码: main函数 ``` #include <stdio.h> #include "Declaration.h" #include "LoadShaders.h" #include <gl/glew.h> #include <gl/freeglut.h> #include "cv.h" #include "highgui.h" #include "cxcore.h" #include "StructDef.h" GLuint *FBOUsedVAOs; GLuint *FBOUsedBuffers; GLuint *programs; GLuint *FBOs; GLuint *DepthTextureIDs; void init() { DepthTextureIDs = (GLuint*)malloc(sizeof(GLuint));//申请深度纹理对象ID的内存 glGenTextures(1, DepthTextureIDs);//产生深度纹理ID glBindTexture(GL_TEXTURE_2D, DepthTextureIDs[0]);//绑定深度纹理ID //设置纹理参数 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_DEPTH_TEXTURE_MODE, GL_INTENSITY); glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, 512, 512, 0, GL_DEPTH_COMPONENT, GL_FLOAT, NULL); glBindTexture(GL_TEXTURE_2D, 0);//解绑纹理ID FBOs = (GLuint*)malloc(sizeof(GLuint));//申请帧缓存对象的内存 glGenFramebuffers(1,FBOs);//产生帧缓存对象 glBindFramebuffer(GL_FRAMEBUFFER, FBOs[0]);//绑定帧缓存对象 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, DepthTextureIDs[0], 0); glDrawBuffer(GL_NONE); glReadBuffer(GL_NONE); glBindFramebuffer(GL_FRAMEBUFFER, 0);//解绑帧缓存对象 programs = (GLuint*)malloc(sizeof(GLuint));//申请着色程序内存 ShaderInfo FBOShader[3] = { //用于渲染shadowmap的着色器 { GL_VERTEX_SHADER, "FBOShader.vert" }, { GL_FRAGMENT_SHADER, "FBOShader.frag" }, { GL_NONE, NULL } }; programs[0] = LoadShaders(FBOShader); //加载着色器 //计算各种坐标转换矩阵 float ModelMat[16]; float ViewMat[16]; float PerspectiveProjectMat[16]; float MAngle321[3] = {0, 0, 0.0}; float MOffset[3] = {0.0, 0.0, 0.0}; float VAngle321[3] = {0, 1.57, 0.0}; float VOffset[3] = {0, 0, 5.0}; float FOV = 1.57; float Aspect = 1; float NearDist = 1.0; float FarDist = 6; ModelMatCal(ModelMat, MAngle321, MOffset); ViewMatCal(ViewMat, VAngle321, VOffset); PerspectiveProjectMatCal(PerspectiveProjectMat, FOV, Aspect, NearDist, FarDist); float MVMat[16]; float MVPMat[16]; MatMultiplyMat4(MVMat, ViewMat, ModelMat); MatMultiplyMat4(MVPMat, PerspectiveProjectMat, MVMat); //将矩阵传递进FBOShader glUseProgram(programs[0]);//必须放在向shader中传Uniform数据的前面 GLint MVPMatLoc; MVPMatLoc = glGetUniformLocation(programs[0],"MVPMat"); glUniformMatrix4fv(MVPMatLoc, 1, GL_FALSE, MVPMat); //设置顶点数组 #define BUFFER_OFFSET(offset) ((void *)(NULL+offset)) FBOUsedVAOs = (GLuint*)malloc(sizeof(GLuint)); FBOUsedBuffers = (GLuint*)malloc(sizeof(GLuint)); glGenVertexArrays(1, FBOUsedVAOs); glGenBuffers(1, FBOUsedBuffers); float FBOUsedVertices[24]= { 1.0f, 1.0f, 3.0f, 1.0f, -1.0f, 1.0f, 3.0f, 1.0f, -1.0f, -1.0f, 3.0f, 1.0f, 1.0f, 1.0f, 3.0f, 1.0f, -1.0f, -1.0f, 3.0f, 1.0f, 1.0f, -1.0f, 3.0f, 1.0f }; glBindVertexArray(FBOUsedVAOs[0]); glBindBuffer(GL_ARRAY_BUFFER, FBOUsedBuffers[0]); glBufferData(GL_ARRAY_BUFFER, sizeof(FBOUsedVertices), FBOUsedVertices, GL_STATIC_DRAW); glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(0)); glEnableVertexAttribArray(0); } void display() { //向帧缓存对象中渲染数据 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glBindFramebuffer(GL_FRAMEBUFFER, FBOs[0]);//绑定帧缓存对象 glUseProgram(programs[0]);//选定shader glBindVertexArray(FBOUsedVAOs[0]); glDrawArrays(GL_TRIANGLES, 0, 6); float *DepthPixel = (float *)malloc(sizeof(float)); glReadPixels(256,256,1,1,GL_DEPTH_COMPONENT,GL_FLOAT,DepthPixel); glBindFramebuffer(GL_FRAMEBUFFER, 0); glFlush(); } int main(int argc, char** argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_RGBA); glutInitWindowSize(512, 512); glutInitContextVersion(4, 3); glutInitContextProfile(GLUT_CORE_PROFILE); glutCreateWindow(argv[0]); glewExperimental = GL_TRUE; if (glewInit()) { cerr << "Unable to initialize GLEW ... exiting" << endl; exit(1); } glEnable(GL_TEXTURE_CUBE_MAP); glEnable(GL_DEPTH_TEST); glEnable(GL_TEXTURE_2D); init(); glutDisplayFunc(display); glutMainLoop(); } ``` 顶点着色器 ``` #version 430 layout(location = 0)in vec4 VertPosition; uniform mat4 MVPMat; void main() { gl_Position = MVPMat * VertPosition; } ``` 片元着色器 ``` #version 430 out vec4 FragColor; void main() { FragColor = vec4(vec3(gl_FragCoord.z), 1.0f); } ``` 将display函数中的glBindFramebuffer(GL_FRAMEBUFFER, FBOs[0])注释掉,就能够在DepthPixel中看到正确的深度结果,但是只要绑定了fbo,其深度结果就全都是0.也就是说,在屏渲染的时候,我能够获取到正确的深度值,但是离屏渲染的时候,深度值总是0.

openGL运行不显示图形

代码如下 #include<GL/glut.h> #include<windows.h> void init(); void reshape(int w, int h); void display(void); void init(void) { glClearColor(1, 1, 0, 1.0); //指定清除颜色,即背景颜色 glShadeModel(GL_FLAT); } void reshape(int w, int h) { glViewport(0, 0, w, h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D(0, (double)w, 0, (double)h); } void display(void) { glClear(GL_COLOR_BUFFER_BIT); int x[5] = { 180,120,140,220,240 }; int y[5] = { 180,140,60,60,140 }; ////*****五边形 glBegin(GL_LINE_LOOP); glColor3f(1, 0, 0); for (int i = 0;i < 5;i++) { glVertex2i(x[i], y[i]); } glEnd(); //*****五角星 glBegin(GL_LINES); glColor3f(0, 1, 0); for (int i = 0;i < 5;i++) { glVertex2i(x[i], y[i]); if (i + 2 > 4) { int j = (i + 2) % 5; glVertex2i(x[j], y[j]); } glVertex2i(x[i+2], y[i+2]); } glEnd(); glFlush(); } int main(int argc, char* argv[]) { glutInit(&argc, argv); //初始化GLUT并处理命令行参数 glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB); //指定模式:双缓存;RGB模式 glutInitWindowSize(500, 500); //指定窗口大小(像素) glutInitWindowPosition(50, 50); //指定窗口左上角在屏幕上的位置 glutCreateWindow("五角星"); //使用OpenGL场景创建一个窗口,参数为窗口名称 init(); //调用初始化函数 glutDisplayFunc(display); //显示 glutReshapeFunc(reshape); //重绘 glutMainLoop(); return 0; //ANSI C要求函数main()返回一个int值 } ``` ```

关于OpenGL显示物体边缘的问题,求助各位高手

我用OpenGL画一个物体在填充颜色的同时显示它的边缘线,就像在SolidWorks环境中第一幅图那样。 但我看网上人说用可以用多边形线框模式在填充模式基础上再绘制一次,但我绘制线框出来的效果如第二幅图那样,物体面上多了一些不必要的线。。可能是因为我的模型是stl数据导入的原因。。 想请教一下有没有大神知道SolidWorks这种效果的实现方法?![图片说明](https://img-ask.csdn.net/upload/201511/06/1446796134_258226.png) ![图片说明](https://img-ask.csdn.net/upload/201511/06/1446796286_830273.png)

关于opengl管理纹理对象的问题

蓝宝书上生成三个mip贴图的代码如下: for(iLoop = 0; iLoop < TEXTURE-COUNT; iLoop++) { // Bind to next texture object glBindTexture(GL_TEXTURE_2D, textures[iLoop]); // Load texture, set filter and wrap modes pBytes = gltReadTGABits(szTextureFiles[iLoop],&iWidth, &iHeight, &iComponents, &eFormat); // Load texture, set filter and wrap modes glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glTexImage2D(GL_TEXTURE_2D, 0, iComponents, iWidth, iHeight, 0, eFormat, GL_UNSIGNED_BYTE, pBytes); glGenerateMipmap(GL_TEXTURE_2D); // Don't need original texture data any more free(pBytes); } 示例代码通过不断的调用 glBindTexture(GL_TEXTURE_2D, textures[i])来使用这三个纹理对像。我想知道这三个纹理对象是如何管理的。是在GL_TEXTURE_2D这个变量中分别储存多个纹理,并通过纹理对象名来调用的吗?

在中国程序员是青春饭吗?

今年,我也32了 ,为了不给大家误导,咨询了猎头、圈内好友,以及年过35岁的几位老程序员……舍了老脸去揭人家伤疤……希望能给大家以帮助,记得帮我点赞哦。 目录: 你以为的人生 一次又一次的伤害 猎头界的真相 如何应对互联网行业的「中年危机」 一、你以为的人生 刚入行时,拿着傲人的工资,想着好好干,以为我们的人生是这样的: 等真到了那一天,你会发现,你的人生很可能是这样的: ...

程序员请照顾好自己,周末病魔差点一套带走我。

程序员在一个周末的时间,得了重病,差点当场去世,还好及时挽救回来了。

技术大佬:我去,你写的 switch 语句也太老土了吧

昨天早上通过远程的方式 review 了两名新来同事的代码,大部分代码都写得很漂亮,严谨的同时注释也很到位,这令我非常满意。但当我看到他们当中有一个人写的 switch 语句时,还是忍不住破口大骂:“我擦,小王,你丫写的 switch 语句也太老土了吧!” 来看看小王写的代码吧,看完不要骂我装逼啊。 private static String createPlayer(PlayerTypes p...

和黑客斗争的 6 天!

互联网公司工作,很难避免不和黑客们打交道,我呆过的两家互联网公司,几乎每月每天每分钟都有黑客在公司网站上扫描。有的是寻找 Sql 注入的缺口,有的是寻找线上服务器可能存在的漏洞,大部分都...

上班一个月,后悔当初着急入职的选择了

最近有个老铁,告诉我说,上班一个月,后悔当初着急入职现在公司了。他之前在美图做手机研发,今年美图那边今年也有一波组织优化调整,他是其中一个,在协商离职后,当时捉急找工作上班,因为有房贷供着,不能没有收入来源。所以匆忙选了一家公司,实际上是一个大型外包公司,主要派遣给其他手机厂商做外包项目。**当时承诺待遇还不错,所以就立马入职去上班了。但是后面入职后,发现薪酬待遇这块并不是HR所说那样,那个HR自...

女程序员,为什么比男程序员少???

昨天看到一档综艺节目,讨论了两个话题:(1)中国学生的数学成绩,平均下来看,会比国外好?为什么?(2)男生的数学成绩,平均下来看,会比女生好?为什么?同时,我又联想到了一个技术圈经常讨...

总结了 150 余个神奇网站,你不来瞅瞅吗?

原博客再更新,可能就没了,之后将持续更新本篇博客。

副业收入是我做程序媛的3倍,工作外的B面人生是怎样的?

提到“程序员”,多数人脑海里首先想到的大约是:为人木讷、薪水超高、工作枯燥…… 然而,当离开工作岗位,撕去层层标签,脱下“程序员”这身外套,有的人生动又有趣,马上展现出了完全不同的A/B面人生! 不论是简单的爱好,还是正经的副业,他们都干得同样出色。偶尔,还能和程序员的特质结合,产生奇妙的“化学反应”。 @Charlotte:平日素颜示人,周末美妆博主 大家都以为程序媛也个个不修边幅,但我们也许...

如果你是老板,你会不会踢了这样的员工?

有个好朋友ZS,是技术总监,昨天问我:“有一个老下属,跟了我很多年,做事勤勤恳恳,主动性也很好。但随着公司的发展,他的进步速度,跟不上团队的步伐了,有点...

我入职阿里后,才知道原来简历这么写

私下里,有不少读者问我:“二哥,如何才能写出一份专业的技术简历呢?我总感觉自己写的简历太烂了,所以投了无数份,都石沉大海了。”说实话,我自己好多年没有写过简历了,但我认识的一个同行,他在阿里,给我说了一些他当年写简历的方法论,我感觉太牛逼了,实在是忍不住,就分享了出来,希望能够帮助到你。 01、简历的本质 作为简历的撰写者,你必须要搞清楚一点,简历的本质是什么,它就是为了来销售你的价值主张的。往深...

外包程序员的幸福生活

今天给你们讲述一个外包程序员的幸福生活。男主是Z哥,不是在外包公司上班的那种,是一名自由职业者,接外包项目自己干。接下来讲的都是真人真事。 先给大家介绍一下男主,Z哥,老程序员,是我十多年前的老同事,技术大牛,当过CTO,也创过业。因为我俩都爱好喝酒、踢球,再加上住的距离不算远,所以一直也断断续续的联系着,我对Z哥的状况也有大概了解。 Z哥几年前创业失败,后来他开始干起了外包,利用自己的技术能...

优雅的替换if-else语句

场景 日常开发,if-else语句写的不少吧??当逻辑分支非常多的时候,if-else套了一层又一层,虽然业务功能倒是实现了,但是看起来是真的很不优雅,尤其是对于我这种有强迫症的程序"猿",看到这么多if-else,脑袋瓜子就嗡嗡的,总想着解锁新姿势:干掉过多的if-else!!!本文将介绍三板斧手段: 优先判断条件,条件不满足的,逻辑及时中断返回; 采用策略模式+工厂模式; 结合注解,锦...

深入剖析Springboot启动原理的底层源码,再也不怕面试官问了!

大家现在应该都对Springboot很熟悉,但是你对他的启动原理了解吗?

离职半年了,老东家又发 offer,回不回?

有小伙伴问松哥这个问题,他在上海某公司,在离职了几个月后,前公司的领导联系到他,希望他能够返聘回去,他很纠结要不要回去? 俗话说好马不吃回头草,但是这个小伙伴既然感到纠结了,我觉得至少说明了两个问题:1.曾经的公司还不错;2.现在的日子也不是很如意。否则应该就不会纠结了。 老实说,松哥之前也有过类似的经历,今天就来和小伙伴们聊聊回头草到底吃不吃。 首先一个基本观点,就是离职了也没必要和老东家弄的苦...

2020阿里全球数学大赛:3万名高手、4道题、2天2夜未交卷

阿里巴巴全球数学竞赛( Alibaba Global Mathematics Competition)由马云发起,由中国科学技术协会、阿里巴巴基金会、阿里巴巴达摩院共同举办。大赛不设报名门槛,全世界爱好数学的人都可参与,不论是否出身数学专业、是否投身数学研究。 2020年阿里巴巴达摩院邀请北京大学、剑桥大学、浙江大学等高校的顶尖数学教师组建了出题组。中科院院士、美国艺术与科学院院士、北京国际数学...

男生更看重女生的身材脸蛋,还是思想?

往往,我们看不进去大段大段的逻辑。深刻的哲理,往往短而精悍,一阵见血。问:产品经理挺漂亮的,有点心动,但不知道合不合得来。男生更看重女生的身材脸蛋,还是...

为什么程序员做外包会被瞧不起?

二哥,有个事想询问下您的意见,您觉得应届生值得去外包吗?公司虽然挺大的,中xx,但待遇感觉挺低,马上要报到,挺纠结的。

当HR压你价,说你只值7K,你该怎么回答?

当HR压你价,说你只值7K时,你可以流畅地回答,记住,是流畅,不能犹豫。 礼貌地说:“7K是吗?了解了。嗯~其实我对贵司的面试官印象很好。只不过,现在我的手头上已经有一份11K的offer。来面试,主要也是自己对贵司挺有兴趣的,所以过来看看……”(未完) 这段话主要是陪HR互诈的同时,从公司兴趣,公司职员印象上,都给予对方正面的肯定,既能提升HR的好感度,又能让谈判气氛融洽,为后面的发挥留足空间。...

面试:第十六章:Java中级开发(16k)

HashMap底层实现原理,红黑树,B+树,B树的结构原理 Spring的AOP和IOC是什么?它们常见的使用场景有哪些?Spring事务,事务的属性,传播行为,数据库隔离级别 Spring和SpringMVC,MyBatis以及SpringBoot的注解分别有哪些?SpringMVC的工作原理,SpringBoot框架的优点,MyBatis框架的优点 SpringCould组件有哪些,他们...

面试阿里p7,被按在地上摩擦,鬼知道我经历了什么?

面试阿里p7被问到的问题(当时我只知道第一个):@Conditional是做什么的?@Conditional多个条件是什么逻辑关系?条件判断在什么时候执...

你期望月薪4万,出门右拐,不送,这几个点,你也就是个初级的水平

先来看几个问题通过注解的方式注入依赖对象,介绍一下你知道的几种方式@Autowired和@Resource有何区别说一下@Autowired查找候选者的...

面试了一个 31 岁程序员,让我有所触动,30岁以上的程序员该何去何从?

最近面试了一个31岁8年经验的程序猿,让我有点感慨,大龄程序猿该何去何从。

大三实习生,字节跳动面经分享,已拿Offer

说实话,自己的算法,我一个不会,太难了吧

程序员垃圾简历长什么样?

已经连续五年参加大厂校招、社招的技术面试工作,简历看的不下于万份 这篇文章会用实例告诉你,什么是差的程序员简历! 疫情快要结束了,各个公司也都开始春招了,作为即将红遍大江南北的新晋UP主,那当然要为小伙伴们做点事(手动狗头)。 就在公众号里公开征简历,义务帮大家看,并一一点评。《启舰:春招在即,义务帮大家看看简历吧》 一石激起千层浪,三天收到两百多封简历。 花光了两个星期的所有空闲时...

《Oracle Java SE编程自学与面试指南》最佳学习路线图2020年最新版(进大厂必备)

正确选择比瞎努力更重要!

《Oracle Java SE编程自学与面试指南》最佳学习路线图(2020最新版)

正确选择比瞎努力更重要!

字节跳动面试官竟然问了我JDBC?

轻松等回家通知

面试官:你连SSO都不懂,就别来面试了

大厂竟然要考我SSO,卧槽。

终于,月薪过5万了!

来看几个问题想不想月薪超过5万?想不想进入公司架构组?想不想成为项目组的负责人?想不想成为spring的高手,超越99%的对手?那么本文内容是你必须要掌握的。本文主要详解bean的生命...

自从喜欢上了B站这12个UP主,我越来越觉得自己是个废柴了!

不怕告诉你,我自从喜欢上了这12个UP主,哔哩哔哩成为了我手机上最耗电的软件,几乎每天都会看,可是吧,看的越多,我就越觉得自己是个废柴,唉,老天不公啊,不信你看看…… 间接性踌躇满志,持续性混吃等死,都是因为你们……但是,自己的学习力在慢慢变强,这是不容忽视的,推荐给你们! 都说B站是个宝,可是有人不会挖啊,没事,今天咱挖好的送你一箩筐,首先啊,我在B站上最喜欢看这个家伙的视频了,为啥 ,咱撇...

立即提问
相关内容推荐