<div dir="ltr">Hi,<div><br><div>Its been quite sometime that I am looking into Off screen rendering using Mesa 11.1.2. :)</div><div><br></div><div>I was able to render the textured model using Mesa 7.5.1 but somehow I couldn't manage lighting the scene there.</div><div><br></div><div>However I want my code to run using Mesa 11.1.2.</div><div>I am not able to see anything in the off-screen rendered targa image.</div><div>It just appears blank.</div><div><br></div><div>What is wrong in the following code ?</div><div><br></div><div>*******</div><div>Note:</div><div>*******</div><div><br></div><div> 1] I am able to create/initialize a mesa context.</div><div> 2] No compilation/linker error in shaders also.</div><div> 3] Have copied osmesa.dll and opengl32.dll in the application's debug folder.</div><div><br></div><div><br></div><div>Draw()</div><div>{</div><div><br></div><div><div><br></div><div><span class="" style="white-space:pre"> </span>// Dark blue background</div><div><span class="" style="white-space:pre">    </span>glClearColor(0.0f, 0.0f, 0.4f, 0.0f);</div><div><span class="" style="white-space:pre">      </span>glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);</div><div><br></div><div><span class="" style="white-space:pre">       </span>//**********************//</div><div><span class="" style="white-space:pre"> </span>//Initialize openGL   //</div><div><span class="" style="white-space:pre">  </span>//**********************//</div><div><span class="" style="white-space:pre"> </span>//enable back face culling</div><div><span class="" style="white-space:pre"> </span>glEnable(GL_CULL_FACE);</div><div><span class="" style="white-space:pre">    </span>glCullFace(GL_BACK);</div><div><br></div><div><span class="" style="white-space:pre">      </span>// Enable blending</div><div><span class="" style="white-space:pre"> </span>glEnable(GL_BLEND);</div><div><span class="" style="white-space:pre">        </span>glEnable(GL_DEPTH_TEST);</div><div><span class="" style="white-space:pre">   </span>glDepthFunc(GL_LESS);</div><div><span class="" style="white-space:pre">      </span>glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);</div><div><br></div><div><span class="" style="white-space:pre">        </span>//***************************//</div><div><span class="" style="white-space:pre">    </span>//Read the mesh data<span class="" style="white-space:pre">         </span> //</div><div><span class="" style="white-space:pre">    </span>//***************************//</div><div><span class="" style="white-space:pre">    </span>readVertexData();</div><div><span class="" style="white-space:pre">  </span>readNormalData();</div><div><span class="" style="white-space:pre">  </span>readIndexData();</div><div><span class="" style="white-space:pre">   </span>readUVData();</div><div><span class="" style="white-space:pre">      </span>create_indexed_vertex_data();</div><div><br></div><div><span class="" style="white-space:pre">     </span>//*********************************//</div><div><span class="" style="white-space:pre">      </span>//Set model view projection matrix //</div><div><span class="" style="white-space:pre">      </span>//*********************************//</div><div><br></div><div><span class="" style="white-space:pre">     </span>//projection matrix</div><div><span class="" style="white-space:pre">        </span>glm::mat4 Projection = glm::ortho(-150.0f, 150.0f, -150.0f, 150.0f, -150.0f, 10000.0f);</div><div><br></div><div><span class="" style="white-space:pre">   </span>//Viewing transform</div><div><span class="" style="white-space:pre">        </span>glm::mat4 View = glm::lookAt(</div><div><span class="" style="white-space:pre">              </span>glm::vec3(4.0f, 3.0f, -3.0f),</div><div><span class="" style="white-space:pre">              </span>glm::vec3(0.0f, 0.0f, 0.0f),</div><div><span class="" style="white-space:pre">               </span>glm::vec3(0.0f, 0.1f, 0.0f)</div><div><span class="" style="white-space:pre">                </span>);</div><div><br></div><div><span class="" style="white-space:pre">        </span>// Model matrix : an identity matrix (model will be at the origin)</div><div><span class="" style="white-space:pre"> </span>glm::mat4 Model = glm::mat4();</div><div><br></div><div><span class="" style="white-space:pre">    </span>// Our ModelViewProjection : multiplication of our 3 matrices</div><div><span class="" style="white-space:pre">      </span>glm::mat4 MVP = Projection *View * Model;</div><div><br></div><div><br></div><div><span class="" style="white-space:pre">        </span>//*********************************//</div><div><span class="" style="white-space:pre">      </span>//Read the shaders                //</div><div><span class="" style="white-space:pre">       </span>//*********************************//</div><div><span class="" style="white-space:pre">      </span>// Create and compile our GLSL program from the shaders</div><div><span class="" style="white-space:pre">    </span>GLuint programID = LoadShaders("simple_vertex.vertexshader", "simple_fragment.fragmentshader");</div><div><br></div><div><br></div><div><br></div><div><span class="" style="white-space:pre">     </span>//*********************************//</div><div><span class="" style="white-space:pre">      </span>// Get a handle for our buffers //</div><div><span class="" style="white-space:pre"> </span>//*********************************//</div><div><span class="" style="white-space:pre">      </span>GLint vertexPosition_modelspaceID = glGetAttribLocation(programID, "vertexPosition_modelspace");</div><div><span class="" style="white-space:pre"> </span>GLuint vertexUVID = glGetAttribLocation(programID, "vertexUV");</div><div><span class="" style="white-space:pre">  </span>GLuint normalID = glGetAttribLocation(programID, "normalv");</div><div><span class="" style="white-space:pre">     </span>GLuint ModelMatrixID = glGetUniformLocation(programID, "Model");</div><div><span class="" style="white-space:pre"> </span>GLuint ViewPositionID = glGetUniformLocation(programID, "viewPos");</div><div><span class="" style="white-space:pre">      </span>// Get a handle for our "MVP" uniform</div><div><span class="" style="white-space:pre">    </span>GLuint MatrixID = glGetUniformLocation(programID, "MVP");</div><div><span class="" style="white-space:pre">        </span>//Materials handler</div><div><span class="" style="white-space:pre">        </span>GLint matAmbientLoc = glGetUniformLocation(programID, "material.ambient");</div><div><span class="" style="white-space:pre">       </span>GLint matDiffuseLoc = glGetUniformLocation(programID, "material.diffuse");</div><div><span class="" style="white-space:pre">       </span>GLint matSpecularLoc = glGetUniformLocation(programID, "material.specular");</div><div><span class="" style="white-space:pre">     </span>GLint matShineLoc = glGetUniformLocation(programID, "material.shininess");</div><div><span class="" style="white-space:pre">       </span>GLfloat matAlphaloc = glGetUniformLocation(programID, "matAlpha");</div><div><br></div><div><span class="" style="white-space:pre">      </span>//Handle for directional light</div><div><span class="" style="white-space:pre">     </span>GLuint dirLighDirID = glGetUniformLocation(programID, "dirLight.direction");</div><div><span class="" style="white-space:pre">     </span>GLuint dirLighAmbID = glGetUniformLocation(programID, "dirLight.ambient");</div><div><span class="" style="white-space:pre">       </span>GLuint dirLighDiffID = glGetUniformLocation(programID, "dirLight.diffuse");</div><div><span class="" style="white-space:pre">      </span>GLuint dirLighSpecID = glGetUniformLocation(programID, "dirLight.specular");</div><div><br></div><div><br></div><div><span class="" style="white-space:pre">   </span>//*********************************//</div><div><span class="" style="white-space:pre">      </span>//Register the buffers            //</div><div><span class="" style="white-space:pre"> </span>//********************************//</div><div><span class="" style="white-space:pre">       </span>GLuint vertexbuffer;</div><div><span class="" style="white-space:pre">       </span>glGenBuffers(1, &vertexbuffer);</div><div><span class="" style="white-space:pre">        </span>glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer);</div><div><span class="" style="white-space:pre">       </span>glBufferData(GL_ARRAY_BUFFER, indexed_vertex_data.size() * sizeof(glm::vec3), indexed_vertex_data.data(), GL_STATIC_DRAW);</div><div><br></div><div><span class="" style="white-space:pre">        </span>GLuint uvbuffer;</div><div><span class="" style="white-space:pre">   </span>glGenBuffers(1, &uvbuffer);</div><div><span class="" style="white-space:pre">    </span>glBindBuffer(GL_ARRAY_BUFFER, uvbuffer);</div><div><span class="" style="white-space:pre">   </span>glBufferData(GL_ARRAY_BUFFER, uv_data.size() * sizeof(glm::vec2), uv_data.data(), GL_STATIC_DRAW);</div><div><br></div><div><span class="" style="white-space:pre">        </span>GLuint normalbuffer;</div><div><span class="" style="white-space:pre">       </span>glGenBuffers(1, &normalbuffer);</div><div><span class="" style="white-space:pre">        </span>glBindBuffer(GL_ARRAY_BUFFER, normalbuffer);</div><div><span class="" style="white-space:pre">       </span>glBufferData(GL_ARRAY_BUFFER, normal_data_point.size() * sizeof(glm::vec3), normal_data_point.data(), GL_STATIC_DRAW);</div><div><br></div><div><span class="" style="white-space:pre">    </span>// Use our shader</div><div><span class="" style="white-space:pre">  </span>glUseProgram(programID);</div><div><br></div><div><span class="" style="white-space:pre">  </span>// Send our transformation to the currently bound shader, </div><div><span class="" style="white-space:pre">        </span>// in the "MVP" uniform</div><div><span class="" style="white-space:pre">  </span>glUniformMatrix4fv(MatrixID, 1, GL_FALSE, &MVP[0][0]);</div><div><br></div><div><span class="" style="white-space:pre">        </span>//model matrix values to vertex sahder</div><div><span class="" style="white-space:pre">     </span>glUniformMatrix4fv(ModelMatrixID, 1, FALSE, glm::value_ptr(Model));</div><div><span class="" style="white-space:pre">        </span>glUniformMatrix4fv(ViewPositionID, 1, FALSE, glm::value_ptr(View));</div><div><br></div><div><br></div><div><span class="" style="white-space:pre">      </span>//***************************************//</div><div><span class="" style="white-space:pre">        </span>//Material values to fragment shader</div><div><span class="" style="white-space:pre">       </span>//***************************************//</div><div><span class="" style="white-space:pre">        </span>GLfloat materialAlpha = 1.0;</div><div><span class="" style="white-space:pre">       </span>glUniform1f(matAlphaloc, materialAlpha);</div><div><span class="" style="white-space:pre">   </span>glUniform4f(matAmbientLoc, 0.9f, 0.25f, 0.21f, 1.0f);</div><div><span class="" style="white-space:pre">      </span>glUniform4f(matDiffuseLoc, 0.9f, 0.14f, 0.14f, 1.0f);</div><div><span class="" style="white-space:pre">      </span>glUniform4f(matSpecularLoc, 0.1f, 0.1f, 0.1f, 1.0f);</div><div><span class="" style="white-space:pre">       </span>glUniform1f(matShineLoc, 16.0f);</div><div><br></div><div><span class="" style="white-space:pre">  </span>//***************************************//</div><div><span class="" style="white-space:pre">        </span>//Directional light values to fragment shader</div><div><span class="" style="white-space:pre">      </span>//***************************************//</div><div><span class="" style="white-space:pre">        </span>glUniform3f(dirLighDirID, -0.2f, -1.0f, -0.3f);</div><div><span class="" style="white-space:pre">    </span>glUniform3f(dirLighAmbID, 0.5f, 0.5f, 0.5f);</div><div><span class="" style="white-space:pre">       </span>glUniform3f(dirLighDiffID, 0.9f, 0.9f, 0.8f);</div><div><span class="" style="white-space:pre">      </span>glUniform3f(dirLighSpecID, 1.0f, 1.0f, 1.0f);</div><div><br></div><div><span class="" style="white-space:pre">     </span>// Load textures</div><div><span class="" style="white-space:pre">   </span>GLuint diffuseMap; </div><div><span class="" style="white-space:pre">       </span>GLuint TextureID = glGetUniformLocation(programID, "MeshTexture");</div><div><br></div><div><span class="" style="white-space:pre">      </span>glGenTextures(1, &diffuseMap);</div><div><span class="" style="white-space:pre"> </span>int width, height;</div><div><span class="" style="white-space:pre"> </span>unsigned char* image;</div><div><span class="" style="white-space:pre">      </span>// Diffuse map</div><div><span class="" style="white-space:pre">     </span>image = SOIL_load_image("Fusion_result.png", &width, &height, 0, SOIL_LOAD_RGBA);</div><div><br></div><div><span class="" style="white-space:pre">       </span>if (image == NULL)</div><div><span class="" style="white-space:pre"> </span>{</div><div><span class="" style="white-space:pre">          </span>cout << "Texture file not found!! \n";</div><div><span class="" style="white-space:pre">     </span>}</div><div><span class="" style="white-space:pre">  </span>else</div><div><span class="" style="white-space:pre">       </span>{</div><div><br></div><div><span class="" style="white-space:pre">         </span>glBindTexture(GL_TEXTURE_2D, diffuseMap);</div><div><span class="" style="white-space:pre">          </span>glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, image);</div><div><span class="" style="white-space:pre">               </span>glGenerateMipmap(GL_TEXTURE_2D);</div><div><span class="" style="white-space:pre">           </span>SOIL_free_image_data(image);</div><div><span class="" style="white-space:pre">               </span>glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);</div><div><span class="" style="white-space:pre">              </span>glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);</div><div><span class="" style="white-space:pre">              </span>glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);</div><div><span class="" style="white-space:pre">            </span>//glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST_MIPMAP_NEAREST);</div><div><span class="" style="white-space:pre">                </span>glBindTexture(GL_TEXTURE_2D, 0);</div><div><br></div><div><br></div><div><span class="" style="white-space:pre">         </span>// Bind our texture in Texture Unit 0</div><div><span class="" style="white-space:pre">              </span>//glActiveTexture(GL_TEXTURE0);</div><div><span class="" style="white-space:pre">            </span>glBindTexture(GL_TEXTURE_2D, diffuseMap);</div><div><span class="" style="white-space:pre">          </span>glUniform1i(TextureID, 0);</div><div><span class="" style="white-space:pre">         </span></div><div><span class="" style="white-space:pre">   </span>}</div><div><br></div><div><span class="" style="white-space:pre"> </span>// 1rst attribute buffer : vertices</div><div><span class="" style="white-space:pre">        </span>glEnableVertexAttribArray(vertexPosition_modelspaceID);</div><div><span class="" style="white-space:pre">    </span>glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer);</div><div><span class="" style="white-space:pre">       </span>glVertexAttribPointer(</div><div><span class="" style="white-space:pre">             </span>vertexPosition_modelspaceID, // The attribute we want to configure</div><div><span class="" style="white-space:pre">         </span>3,                  // size</div><div><span class="" style="white-space:pre">               </span>GL_FLOAT,           // type</div><div><span class="" style="white-space:pre">           </span>GL_FALSE,           // normalized?</div><div><span class="" style="white-space:pre">            </span>0,                  // stride</div><div><span class="" style="white-space:pre">             </span>(void*)0            // array buffer offset</div><div><span class="" style="white-space:pre">           </span>);</div><div><br></div><div><span class="" style="white-space:pre">        </span>// 2ND attribute buffer : UVs</div><div><span class="" style="white-space:pre">      </span>glEnableVertexAttribArray(vertexUVID);</div><div><span class="" style="white-space:pre">     </span>glBindBuffer(GL_ARRAY_BUFFER, uvbuffer);</div><div><span class="" style="white-space:pre">   </span>glVertexAttribPointer(</div><div><span class="" style="white-space:pre">             </span>vertexUVID,                   // The attribute we want to configure</div><div><span class="" style="white-space:pre">               </span>2,                            // size : U+V => 2</div><div><span class="" style="white-space:pre">          </span>GL_FLOAT,                     // type</div><div><span class="" style="white-space:pre">            </span>GL_FALSE,                     // normalized?</div><div><span class="" style="white-space:pre">             </span>0,                            // stride</div><div><span class="" style="white-space:pre">              </span>(void*)0                      // array buffer offset</div><div><span class="" style="white-space:pre">            </span>);</div><div><br></div><div><span class="" style="white-space:pre">        </span>// 3rd attribute buffer : normals</div><div><span class="" style="white-space:pre">  </span>glEnableVertexAttribArray(normalID);</div><div><span class="" style="white-space:pre">       </span>glBindBuffer(GL_ARRAY_BUFFER, normalbuffer);</div><div><span class="" style="white-space:pre">       </span>glVertexAttribPointer(</div><div><span class="" style="white-space:pre">             </span>normalID, // The attribute we want to configure</div><div><span class="" style="white-space:pre">            </span>3,                  // size</div><div><span class="" style="white-space:pre">               </span>GL_FLOAT,           // type</div><div><span class="" style="white-space:pre">           </span>GL_FALSE,           // normalized?</div><div><span class="" style="white-space:pre">            </span>0,                  // stride</div><div><span class="" style="white-space:pre">             </span>(void*)0            // array buffer offset</div><div><span class="" style="white-space:pre">           </span>);</div><div><br></div><div><br></div><div><span class="" style="white-space:pre">       </span>glGetError();</div><div><span class="" style="white-space:pre">      </span>// Draw the triangle !</div><div><span class="" style="white-space:pre">     </span>glDrawArrays(GL_TRIANGLES, 0, indexed_vertex_data.size()); </div><div><br></div><div><span class="" style="white-space:pre">      </span>SaveScreenGrab("mesa_snapshot.tga");</div><div><br></div><div><br></div><div><span class="" style="white-space:pre">   </span>glDisableVertexAttribArray(vertexPosition_modelspaceID);</div><div><br></div><div><span class="" style="white-space:pre">  </span>// Cleanup VBO</div><div><span class="" style="white-space:pre">     </span>glDeleteBuffers(1, &vertexbuffer);</div><div><span class="" style="white-space:pre">     </span>glDeleteBuffers(1, &normalbuffer);</div><div><span class="" style="white-space:pre">     </span>glDeleteBuffers(1, &uvbuffer);</div><div><span class="" style="white-space:pre"> </span>glDeleteTextures(1, &diffuseMap);</div><div><span class="" style="white-space:pre">      </span>glDeleteProgram(programID);</div></div><div><br></div><div>}</div><div><br></div><div>*************************</div><div>Shader code</div><div>*************************</div><div>--------------------</div><div>vertex shader:</div><div>---------------------</div><div><br></div><div><div> attribute vec3 vertexPosition_modelspace;</div><div> attribute vec2 vertexUV;</div><div> attribute vec3 normalv;</div><div><br></div><div> varying vec2 TexCoords;</div><div> varying vec3 normalf;</div><div> varying vec3 FragPos;</div><div><br></div><div> uniform mat4 MVP;</div><div> uniform mat4 Model;</div><div><br></div><div><br></div><div> void main() {</div><div><br></div><div><span style="white-space:pre">    </span>gl_Position = MVP * vec4(vertexPosition_modelspace,1);</div><div>    FragPos = vec3(Model * vec4(vertexPosition_modelspace,1));</div><div>    normalf = vec3(Model * vec4(normalv,1)); </div><div>    TexCoords = vertexUV; </div><div><br></div><div> }</div></div><div><br></div><div><br></div><div>------------------------</div><div>Fragment shader:</div><div>-------------------------</div><div><div> #version 120</div><div><div><br></div><div>struct Material{</div><div>    vec4 ambient;</div><div>    vec4 diffuse;</div><div>    vec4 specular;    </div><div>    float shininess;</div><div>}; </div><div><br></div><div>struct DirLight {</div><div>    vec3 direction;</div><div><span class="" style="white-space:pre">     </span></div><div>    vec3 ambient;</div><div>    vec3 diffuse;</div><div>    vec3 specular;</div><div>};</div><div><br></div><div><br></div><div>in vec3 FragPos;  </div><div>in vec3 normalf;  </div><div>in vec2 TexCoords;</div><div>in vec3 vertexColor;</div><div>vec4 texel0;</div><div>     </div><div><br></div><div>uniform sampler2D MeshTexture;</div><div>uniform DirLight dirLight;</div><div>  </div><div>out vec4 ResultFragColor;</div><div>  </div><div>uniform vec3 viewPos;</div><div>uniform Material material;</div><div>uniform float matAlpha;</div><div><br></div><div>//Function prototype</div><div>vec4 SurfaceColor (in Material mat, in vec4 texel);</div><div><br></div><div>void main()</div><div>{</div><div><br></div><div>     texel0 = texture2D(MeshTexture, TexCoords);</div><div><br></div><div>    vec3 norm = normalize(normalf);</div><div><span style="white-space:pre">    </span>vec3 viewDir = normalize(viewPos - FragPos);</div><div><span style="white-space:pre">    </span>vec3 lightDir = normalize(-dirLight.direction);</div><div><br></div><div>    // Diffuse shading</div><div>    float diff = max(dot(norm, lightDir), 0.0);</div><div><br></div><div>    // Specular shading</div><div>    vec3 reflectDir = reflect(-lightDir, norm);</div><div>    float spec = pow(max(dot(viewDir, reflectDir), 0.0), material.shininess);</div><div><br></div><div><span class="" style="white-space:pre">    </span>vec4 surfaceColorValue ;</div><div><span class="" style="white-space:pre">   </span>surfaceColorValue = mix(material.diffuse, texel0, texel0.a);</div><div><span class="" style="white-space:pre">       </span>surfaceColorValue.a =  min(matAlpha*( 1 + texel0.a) , 1);</div><div><span class="" style="white-space:pre"> </span></div><div><br></div><div><span class="" style="white-space:pre">  </span>vec4 ambient = vec4(dirLight.ambient, 1)  * surfaceColorValue ;</div><div><span class="" style="white-space:pre">   </span>vec4 diffuse = vec4(dirLight.diffuse, 1) * diff * surfaceColorValue ;</div><div><span class="" style="white-space:pre">      </span>vec4 specular = vec4(dirLight.specular, 1)  * spec  * material.specular ;</div><div><br></div><div><span class="" style="white-space:pre">       </span>vec4 result = ambient + diffuse + specular ;</div><div><br></div><div><span class="" style="white-space:pre">      </span>ResultFragColor = result;</div><div><br></div><div>} </div><div><br></div><div><span class="" style="white-space:pre">      </span>vec4 SurfaceColor (in Material mat, in vec4 texel)</div><div><span class="" style="white-space:pre"> </span>{</div><div><span class="" style="white-space:pre">  </span>  vec4 SurfColor;</div><div><br></div><div><span class="" style="white-space:pre">        </span>  SurfColor = mix(mat.diffuse, texel, texel.a);</div><div><span class="" style="white-space:pre">   </span>  SurfColor.a =  min(matAlpha*( 1 + texel.a) , 1);</div><div><span class="" style="white-space:pre">       </span>  return SurfColor;</div><div><span class="" style="white-space:pre">       </span> </div><div><span class="" style="white-space:pre"> </span>}</div><div><br></div></div></div><div>}</div><div><br></div><div><br></div><div><br></div><div><br></div><div>Thanks & Regards,</div><div>Vikram</div><div> </div></div></div>